/*******************************************************************************
* 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;
using System.Xml;
using OfficeOpenXml.Style;
namespace OfficeOpenXml
{
///
/// Represents one or more columns within the worksheet
///
public class ExcelColumn : IRangeID
{
private ExcelWorksheet _worksheet;
private XmlElement _colElement = null;
#region ExcelColumn Constructor
///
/// Creates a new instance of the ExcelColumn class.
/// For internal use only!
///
///
///
protected internal ExcelColumn(ExcelWorksheet Worksheet, int col)
{
_worksheet = Worksheet;
_columnMin = col;
_columnMax = col;
_width = _worksheet.DefaultColWidth;
}
#endregion
int _columnMin;
///
/// Sets the first column the definition refers to.
///
public int ColumnMin
{
get { return _columnMin; }
//set { _columnMin=value; }
}
internal int _columnMax;
///
/// Sets the last column the definition refers to.
///
public int ColumnMax
{
get { return _columnMax; }
set
{
if (value < _columnMin && value > ExcelPackage.MaxColumns)
{
throw new Exception("ColumnMax out of range");
}
foreach (ExcelColumn c in _worksheet._columns)
{
if (c.ColumnMin > _columnMin && c.ColumnMax <= value && c.ColumnMin!=_columnMin)
{
throw new Exception(string.Format("ColumnMax can not spann over existing column {0}.",c.ColumnMin));
}
}
_columnMax = value;
}
}
///
/// Internal range id for the column
///
internal ulong ColumnID
{
get
{
return ExcelColumn.GetColumnID(_worksheet.SheetID, ColumnMin);
}
}
#region ExcelColumn Hidden
///
/// Allows the column to be hidden in the worksheet
///
internal bool _hidden=false;
public bool Hidden
{
get
{
return _hidden;
}
set
{
if (_worksheet._package.DoAdjustDrawings)
{
var pos = _worksheet.Drawings.GetDrawingWidths();
_hidden = value;
_worksheet.Drawings.AdjustWidth(pos);
}
else
{
_hidden = value;
}
}
}
#endregion
#region ExcelColumn Width
internal double VisualWidth
{
get
{
if (_hidden || (Collapsed && OutlineLevel>0))
{
return 0;
}
else
{
return _width;
}
}
}
internal double _width;
///
/// Sets the width of the column in the worksheet
///
public double Width
{
get
{
return _width;
}
set
{
if (_worksheet._package.DoAdjustDrawings)
{
var pos = _worksheet.Drawings.GetDrawingWidths();
_width = value;
_worksheet.Drawings.AdjustWidth(pos);
}
else
{
_width = value;
}
if (_hidden && value!=0)
{
_hidden = false;
}
}
}
///
/// If set to true a column automaticlly resize(grow wider) when a user inputs numbers in a cell.
///
public bool BestFit
{
get;
set;
}
///
/// If the column is collapsed in outline mode
///
public bool Collapsed { get; set; }
///
/// Outline level. Zero if no outline
///
public int OutlineLevel { get; set; }
///
/// Phonetic
///
public bool Phonetic { get; set; }
#endregion
#region ExcelColumn Style
///
/// 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.
///
public ExcelStyle Style
{
get
{
string letter = ExcelCell.GetColumnLetter(ColumnMin);
string endLetter = ExcelCell.GetColumnLetter(ColumnMax);
return _worksheet.Workbook.Styles.GetStyleObject(_styleID, _worksheet.PositionID, letter + ":" + endLetter);
}
}
internal string _styleName="";
///
/// Sets the style for the entire column using a style name.
///
public string StyleName
{
get
{
return _styleName;
}
set
{
_styleID = _worksheet.Workbook.Styles.GetStyleIdFromName(value);
_styleName = value;
}
}
internal int _styleID = 0;
///
/// Sets the style for the entire column using the style ID.
///
public int StyleID
{
get
{
return _styleID;
}
set
{
_styleID = value;
}
}
///
/// Adds a manual page break after the column.
///
public bool PageBreak
{
get;
set;
}
#endregion
///
/// Returns the range of columns covered by the column definition.
///
/// A string describing the range of columns covered by the column definition.
public override string ToString()
{
return string.Format("Column Range: {0} to {1}", _colElement.GetAttribute("min"), _colElement.GetAttribute("min"));
}
///
/// Set the column width from the content of the range. The minimum width is the value of the ExcelWorksheet.defaultColumnWidth property.
/// Note: Cells containing formulas are ignored since EPPlus don't have a calculation engine.
/// Wrapped and merged cells are also ignored.
///
public void AutoFit()
{
_worksheet.Cells[1, _columnMin, ExcelPackage.MaxRows, _columnMax].AutoFitColumns();
}
///
/// Set the column width from the content.
/// Note: Cells containing formulas are ignored since EPPlus don't have a calculation engine.
/// Wrapped and merged cells are also ignored.
///
/// Minimum column width
public void AutoFit(double MinimumWidth)
{
_worksheet.Cells[1, _columnMin, ExcelPackage.MaxRows, _columnMax].AutoFitColumns(MinimumWidth);
}
///
/// Set the column width from the content.
/// Note: Cells containing formulas are ignored since EPPlus don't have a calculation engine.
/// Wrapped and merged cells are also ignored.
///
/// Minimum column width
/// Maximum column width
public void AutoFit(double MinimumWidth, double MaximumWidth)
{
_worksheet.Cells[1, _columnMin, ExcelPackage.MaxRows, _columnMax].AutoFitColumns(MinimumWidth, MaximumWidth);
}
///
/// Get the internal RangeID
///
/// Sheet no
/// Column
///
internal static ulong GetColumnID(int sheetID, int column)
{
return ((ulong)sheetID) + (((ulong)column) << 15);
}
#region IRangeID Members
ulong IRangeID.RangeID
{
get
{
return ColumnID;
}
set
{
int prevColMin = _columnMin;
_columnMin = ((int)(value >> 15) & 0x3FF);
_columnMax += prevColMin - ColumnMin;
//Todo:More Validation
if (_columnMax > ExcelPackage.MaxColumns) _columnMax = ExcelPackage.MaxColumns;
}
}
#endregion
///
/// Copies the current column to a new worksheet
///
/// The worksheet where the copy will be created
internal void Clone(ExcelWorksheet added)
{
ExcelColumn newCol = added.Column(ColumnMin);
newCol.ColumnMax = ColumnMax;
newCol.BestFit = BestFit;
newCol.Collapsed = Collapsed;
newCol.Hidden = Hidden;
newCol.OutlineLevel = OutlineLevel;
newCol.PageBreak = PageBreak;
newCol.Phonetic = Phonetic;
newCol.StyleName = StyleName;
newCol.StyleID = StyleID;
newCol.Width = Width;
}
}
}