blob: f4336c78fc2819d434e7ab9910cbf2481e9fddd8 [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;
using System.Xml;
using OfficeOpenXml.Style;
namespace OfficeOpenXml;
internal class RowInternal {
internal double Height = -1;
internal bool Hidden;
internal bool Collapsed;
internal short OutlineLevel;
internal bool PageBreak;
internal bool Phonetic;
internal bool CustomHeight;
}
/// <summary>
/// Represents an individual row in the spreadsheet.
/// </summary>
public class ExcelRow : IRangeId {
private readonly ExcelWorksheet _worksheet;
private readonly XmlElement _rowElement = null;
/// <summary>
/// Internal RowID.
/// </summary>
[Obsolete]
public ulong RowID => GetRowId(_worksheet.SheetID, Row);
/// <summary>
/// Creates a new instance of the ExcelRow class.
/// For internal use only!
/// </summary>
/// <param name="worksheet">The parent worksheet</param>
/// <param name="row">The row number</param>
internal ExcelRow(ExcelWorksheet worksheet, int row) {
_worksheet = worksheet;
Row = row;
}
/// <summary>
/// Provides access to the node representing the row.
/// </summary>
internal XmlNode Node => (_rowElement);
/// <summary>
/// Allows the row to be hidden in the worksheet
/// </summary>
public bool Hidden {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return false;
}
return r.Hidden;
}
set {
var r = GetRowInternal();
r.Hidden = value;
}
}
/// <summary>
/// Sets the height of the row
/// </summary>
public double Height {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null || r.Height < 0) {
return _worksheet.DefaultRowHeight;
}
return r.Height;
}
set {
var r = GetRowInternal();
r.Height = value;
if (r.Hidden && value != 0) {
Hidden = false;
}
r.CustomHeight = (value != _worksheet.DefaultRowHeight);
}
}
/// <summary>
/// Set to true if You don't want the row to Autosize
/// </summary>
public bool CustomHeight {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return false;
}
return r.CustomHeight;
}
set {
var r = GetRowInternal();
r.CustomHeight = value;
}
}
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;
}
}
/// <summary>
/// Sets the style for the entire row using the style ID.
/// </summary>
public int StyleID {
get => _worksheet._styles.GetValue(Row, 0);
set => _worksheet._styles.SetValue(Row, 0, value);
}
/// <summary>
/// Rownumber
/// </summary>
public int Row { get; set; }
/// <summary>
/// If outline level is set this tells that the row is collapsed
/// </summary>
public bool Collapsed {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return false;
}
return r.Collapsed;
}
set {
var r = GetRowInternal();
r.Collapsed = value;
}
}
/// <summary>
/// Outline level.
/// </summary>
public int OutlineLevel {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return 0;
}
return r.OutlineLevel;
}
set {
var r = GetRowInternal();
r.OutlineLevel = (short)value;
}
}
private RowInternal GetRowInternal() {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
r = new();
_worksheet._values.SetValue(Row, 0, r);
}
return r;
}
/// <summary>
/// Show phonetic Information
/// </summary>
public bool Phonetic {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return false;
}
return r.Phonetic;
}
set {
var r = GetRowInternal();
r.Phonetic = value;
}
}
/// <summary>
/// The Style applied to the whole row. Only effekt cells with no individual style set.
/// Use ExcelRange object if you want to set specific styles.
/// </summary>
public ExcelStyle Style =>
_worksheet.Workbook.Styles.GetStyleObject(StyleID, _worksheet.PositionID, Row + ":" + Row);
/// <summary>
/// Adds a manual page break after the row.
/// </summary>
public bool PageBreak {
get {
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null) {
return false;
}
return r.PageBreak;
}
set {
var r = GetRowInternal();
r.PageBreak = value;
}
}
public bool Merged {
get => _worksheet.MergedCells[Row, 0] != null;
set => _worksheet.MergedCells.Add(new(Row, 1, Row, ExcelPackage.MaxColumns), true);
}
internal static ulong GetRowId(int sheetId, int row) {
return ((ulong)sheetId) + (((ulong)row) << 29);
}
[Obsolete]
ulong IRangeId.RangeID {
get => RowID;
set => Row = ((int)(value >> 29));
}
}