blob: f6f5ef8f448df6feda5b1e6b154017356aae7130 [file] [log] [blame]
/*******************************************************************************
* You may amend and distribute as you like, but don't remove this header!
*
* EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
* See http://www.codeplex.com/EPPlus for details.
*
* Copyright (C) 2011 Jan K�llman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
* If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
*
* All code and executables are provided "as is" with no warranty either express or implied.
* The author accepts no liability for any damage or loss of business that this product may cause.
*
* Code change notes:
*
* Author Change Date
*******************************************************************************
* Jan K�llman Initial Release 2009-10-01
* Jan K�llman License changed GPL-->LGPL 2011-12-27
*******************************************************************************/
using System.Xml;
namespace AppsheetEpplus;
/// <summary>
/// Represents one or more columns within the worksheet
/// </summary>
public class ExcelColumn : IRangeId {
private readonly ExcelWorksheet _worksheet;
private readonly XmlElement _colElement = null;
/// <summary>
/// Creates a new instance of the ExcelColumn class.
/// For internal use only!
/// </summary>
/// <param name="worksheet"></param>
/// <param name="col"></param>
protected internal ExcelColumn(ExcelWorksheet worksheet, int col) {
_worksheet = worksheet;
_columnMin = col;
_columnMax = col;
_width = _worksheet.DefaultColWidth;
}
internal int _columnMin;
/// <summary>
/// Sets the first column the definition refers to.
/// </summary>
public int ColumnMin => _columnMin;
//set { _columnMin=value; }
internal int _columnMax;
/// <summary>
/// Sets the last column the definition refers to.
/// </summary>
public int ColumnMax {
get => _columnMax;
set {
if (value < _columnMin && value > ExcelPackage.MaxColumns) {
throw new("ColumnMax out of range");
}
var cse = new CellsStoreEnumerator<object>(
_worksheet._values,
0,
0,
0,
ExcelPackage.MaxColumns);
while (cse.Next()) {
var c = cse.Value as ExcelColumn;
if (cse.Column > _columnMin && c.ColumnMax <= value && cse.Column != _columnMin) {
throw new(string.Format("ColumnMax can not span over existing column {0}.", c.ColumnMin));
}
}
_columnMax = value;
}
}
/// <summary>
/// Internal range id for the column
/// </summary>
internal ulong ColumnID => GetColumnId(_worksheet.SheetID, ColumnMin);
/// <summary>
/// Allows the column to be hidden in the worksheet
/// </summary>
internal bool _hidden;
public bool Hidden {
get => _hidden;
set => _hidden = value;
}
internal double VisualWidth {
get {
if (_hidden || (Collapsed && OutlineLevel > 0)) {
return 0;
}
return _width;
}
}
internal double _width;
/// <summary>
/// Sets the width of the column in the worksheet
/// </summary>
public double Width {
get => _width;
set {
_width = value;
if (_hidden && value != 0) {
_hidden = false;
}
}
}
/// <summary>
/// If set to true a column automaticlly resize(grow wider) when a user inputs numbers in a cell.
/// </summary>
public bool BestFit { get; set; }
/// <summary>
/// If the column is collapsed in outline mode
/// </summary>
public bool Collapsed { get; set; }
/// <summary>
/// Outline level. Zero if no outline
/// </summary>
public int OutlineLevel { get; set; }
/// <summary>
/// Phonetic
/// </summary>
public bool Phonetic { get; set; }
/// <summary>
/// The Style applied to the whole column. Only effects cells with no individual style set.
/// Use Range object if you want to set specific styles.
/// </summary>
public ExcelStyle Style {
get {
string letter = ExcelCellBase.GetColumnLetter(ColumnMin);
string endLetter = ExcelCellBase.GetColumnLetter(ColumnMax);
return _worksheet.Workbook.Styles.GetStyleObject(
StyleID,
_worksheet.PositionID,
letter + ":" + endLetter);
}
}
internal string _styleName = "";
/// <summary>
/// Sets the style for the entire column using a style name.
/// </summary>
public string StyleName {
get => _styleName;
set {
StyleID = _worksheet.Workbook.Styles.GetStyleIdFromName(value);
_styleName = value;
}
}
//internal int _styleID = 0;
/// <summary>
/// Sets the style for the entire column using the style ID.
/// </summary>
public int StyleID {
get => _worksheet._styles.GetValue(0, ColumnMin);
set => _worksheet._styles.SetValue(0, ColumnMin, value);
}
/// <summary>
/// Adds a manual page break after the column.
/// </summary>
public bool PageBreak { get; set; }
public bool Merged {
get => _worksheet.MergedCells[ColumnMin, 0] != null;
set => _worksheet.MergedCells.Add(new(1, ColumnMin, ExcelPackage.MaxRows, ColumnMax), true);
}
/// <summary>
/// Returns the range of columns covered by the column definition.
/// </summary>
/// <returns>A string describing the range of columns covered by the column definition.</returns>
public override string ToString() {
return string.Format(
"Column Range: {0} to {1}",
_colElement.GetAttribute("min"),
_colElement.GetAttribute("min"));
}
/// <summary>
/// Get the internal RangeID
/// </summary>
/// <param name="sheetId">Sheet no</param>
/// <param name="column">Column</param>
/// <returns></returns>
internal static ulong GetColumnId(int sheetId, int column) {
return ((ulong)sheetId) + (((ulong)column) << 15);
}
ulong IRangeId.RangeID {
get => ColumnID;
set {
int prevColMin = _columnMin;
_columnMin = ((int)(value >> 15) & 0x3FF);
_columnMax += prevColMin - ColumnMin;
//Todo:More Validation
if (_columnMax > ExcelPackage.MaxColumns) {
_columnMax = ExcelPackage.MaxColumns;
}
}
}
/// <summary>
/// Copies the current column to a new worksheet
/// </summary>
/// <param name="added">The worksheet where the copy will be created</param>
internal ExcelColumn Clone(ExcelWorksheet added) {
return Clone(added, ColumnMin);
}
internal ExcelColumn Clone(ExcelWorksheet added, int col) {
ExcelColumn newCol = added.Column(col);
newCol.ColumnMax = ColumnMax;
newCol.BestFit = BestFit;
newCol.Collapsed = Collapsed;
newCol.OutlineLevel = OutlineLevel;
newCol.PageBreak = PageBreak;
newCol.Phonetic = Phonetic;
newCol._styleName = _styleName;
newCol.StyleID = StyleID;
newCol.Width = Width;
newCol.Hidden = Hidden;
return newCol;
}
}