You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.7 KiB
C#
114 lines
3.7 KiB
C#
namespace com.azkoss.excellite
|
|
{
|
|
using System;
|
|
using System.Collections;
|
|
using System.Drawing;
|
|
|
|
internal class MergedCellRanges
|
|
{
|
|
// Methods
|
|
internal MergedCellRanges(ExcelWorksheet parent)
|
|
{
|
|
this.items = new Hashtable();
|
|
this.parent = parent;
|
|
}
|
|
|
|
internal MergedCellRanges(ExcelWorksheet parent, MergedCellRanges sourceRanges)
|
|
{
|
|
this.items = new Hashtable();
|
|
this.parent = parent;
|
|
foreach (MergedCellRange range1 in sourceRanges.Values)
|
|
{
|
|
this.Add(new MergedCellRange(this.parent, range1));
|
|
}
|
|
}
|
|
|
|
internal void Add(MergedCellRange mergedRange)
|
|
{
|
|
if (mergedRange.IsAnyCellMerged)
|
|
{
|
|
throw new ArgumentException("New merged range can't overlap with existing merged range.");
|
|
}
|
|
this.AddInternal(mergedRange);
|
|
CellStyle style1 = new CellStyle();
|
|
MergedCellRanges.ResolveBorder(style1, mergedRange, IndividualBorder.Top, 0, 0, 0, 1);
|
|
MergedCellRanges.ResolveBorder(style1, mergedRange, IndividualBorder.Left, 0, 0, 1, 0);
|
|
MergedCellRanges.ResolveBorder(style1, mergedRange, IndividualBorder.Bottom, mergedRange.Height - 1, 0, 0, 1);
|
|
MergedCellRanges.ResolveBorder(style1, mergedRange, IndividualBorder.Right, 0, mergedRange.Width - 1, 1, 0);
|
|
bool flag1 = false;
|
|
CellStyle style2 = null;
|
|
foreach (ExcelCell cell1 in mergedRange)
|
|
{
|
|
if (!flag1)
|
|
{
|
|
if (!cell1.IsStyleDefault)
|
|
{
|
|
style2 = cell1.Style;
|
|
}
|
|
flag1 = true;
|
|
}
|
|
cell1.AddToMergedRange(mergedRange);
|
|
}
|
|
if ((mergedRange.Value == null) && (style2 != null))
|
|
{
|
|
mergedRange.Style = style2;
|
|
}
|
|
mergedRange.Style.Borders = style1.Borders;
|
|
}
|
|
|
|
internal void AddInternal(MergedCellRange mergedRange)
|
|
{
|
|
this.items.Add(mergedRange, mergedRange);
|
|
}
|
|
|
|
internal void Remove(MergedCellRange mergedRange)
|
|
{
|
|
this.items.Remove(mergedRange);
|
|
foreach (ExcelCell cell1 in mergedRange)
|
|
{
|
|
cell1.RemoveFromMergedRange();
|
|
}
|
|
}
|
|
|
|
private static void ResolveBorder(CellStyle bordersStyle, MergedCellRange mergedRange, IndividualBorder borderId, int row, int column, int rowInc, int colInc)
|
|
{
|
|
CellBorder border1 = bordersStyle.Borders[borderId];
|
|
bool flag1 = true;
|
|
while ((row < mergedRange.Height) && (column < mergedRange.Width))
|
|
{
|
|
CellBorder border2 = mergedRange[row, column].Style.Borders[borderId];
|
|
if (flag1)
|
|
{
|
|
border1.LineStyle = border2.LineStyle;
|
|
border1.LineColor = border2.LineColor;
|
|
flag1 = false;
|
|
}
|
|
else if ((border2.LineStyle != border1.LineStyle) || (border2.LineColor != border1.LineColor))
|
|
{
|
|
border1.LineStyle = LineStyle.None;
|
|
border1.LineColor = Color.Empty;
|
|
return;
|
|
}
|
|
row += rowInc;
|
|
column += colInc;
|
|
}
|
|
}
|
|
|
|
|
|
// Properties
|
|
public ICollection Values
|
|
{
|
|
get
|
|
{
|
|
return this.items.Values;
|
|
}
|
|
}
|
|
|
|
|
|
// Fields
|
|
private Hashtable items;
|
|
private ExcelWorksheet parent;
|
|
}
|
|
}
|
|
|