public void EnumCellstore() { var ws = _pck.Workbook.Worksheets.Add("enum"); LoadData(ws, 5000); var o = new CellsStoreEnumerator<ExcelCoreValue>(ws._values, 2, 1, 5, 3); foreach (var i in o) { Console.WriteLine(i); } }
public RangeInfo(ExcelWorksheet ws, int fromRow, int fromCol, int toRow, int toCol) { _ws = ws; _fromRow = fromRow; _fromCol = fromCol; _toRow = toRow; _toCol = toCol; _address = new ExcelAddressBase(_fromRow, _fromCol, _toRow, _toCol); _address._ws = ws.Name; _values = new CellsStoreEnumerator<object>(ws._values, _fromRow, _fromCol, _toRow, _toCol); _cell = new CellInfo(_ws, _values); }
public void EnumCellstore() { var ws = _pck.Workbook.Worksheets.Add("enum"); LoadData(ws, 5000); var o = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, 2, 1, 5, 3); foreach (var i in o) { Console.WriteLine(i); } }
/// <summary> /// Removes the comment /// </summary> /// <param name="comment">The comment to remove</param> public void Remove(ExcelComment comment) { ulong id = ExcelAddress.GetCellID(Worksheet.SheetID, comment.Range._fromRow, comment.Range._fromCol); //int ix=_comments.IndexOf(id); int i = -1; ExcelComment c = null; if (Worksheet._commentsStore.Exists(comment.Range._fromRow, comment.Range._fromCol, ref i)) { c = _list[i]; } if (comment == c) { // comment.TopNode.ParentNode?.RemoveChild(comment.TopNode); //Remove VML comment._commentHelper.TopNode.ParentNode?.RemoveChild(comment._commentHelper.TopNode); //Remove Comment if (Worksheet.VmlDrawingsComments._drawings.ContainsKey(id)) { Worksheet.VmlDrawingsComments._drawings.Delete(id); } _list.RemoveAt(i); Worksheet._commentsStore.Delete(comment.Range._fromRow, comment.Range._fromCol, 1, 1, false); //Issue 15549, Comments should not be shifted var ci = new CellsStoreEnumerator <int>(Worksheet._commentsStore); while (ci.Next()) { if (ci.Value > i) { ci.Value -= 1; } } } else { throw (new ArgumentException("Comment does not exist in the worksheet")); } }
private double GetRowHeightFromCellFonts(int row, ExcelWorksheet ws) { var dh = ws.DefaultRowHeight; if (double.IsNaN(dh) || ws.CustomHeight == false) { var height = dh; var cse = new CellsStoreEnumerator <ExcelCoreValue>(_drawings.Worksheet._values, row, 0, row, ExcelPackage.MaxColumns); var styles = _drawings.Worksheet.Workbook.Styles; while (cse.Next()) { var xfs = styles.CellXfs[cse.Value._styleId]; var f = styles.Fonts[xfs.FontId]; double rh; if (_textHeights.ContainsKey(cse.Value._styleId)) { rh = _textHeights[cse.Value._styleId]; } else { rh = ExcelFontXml.GetFontHeight(f.Name, f.Size) * 0.75; _textHeights.Add(cse.Value._styleId, rh); } if (rh > height) { height = rh; } } return(height); } else { return(dh); } }
private static void GetChain(DependencyChain depChain, ILexer lexer, ExcelRangeBase Range, ExcelCalculationOption options) { var ws = Range.Worksheet; var fs = new CellsStoreEnumerator <object>(ws._formulas, Range.Start.Row, Range.Start.Column, Range.End.Row, Range.End.Column); while (fs.Next()) { if (fs.Value == null || fs.Value.ToString().Trim() == "") { continue; } var id = ExcelCellBase.GetCellID(ws.SheetID, fs.Row, fs.Column); if (!depChain.index.ContainsKey(id)) { var f = new FormulaCell() { SheetID = ws.SheetID, Row = fs.Row, Column = fs.Column }; if (fs.Value is int) { f.Formula = ws._sharedFormulas[(int)fs.Value].GetFormula(fs.Row, fs.Column, ws.Name); } else { f.Formula = fs.Value.ToString(); } if (!string.IsNullOrEmpty(f.Formula)) { f.Tokens = lexer.Tokenize(f.Formula, Range.Worksheet.Name).ToList(); ws._formulaTokens.SetValue(fs.Row, fs.Column, f.Tokens); depChain.Add(f); FollowChain(depChain, lexer, ws.Workbook, ws, f, options); } } } }
private void SetStyleAddress(StyleBase sender, Style.StyleChangeEventArgs e, ExcelAddressBase address, ExcelWorksheet ws, ref Dictionary <int, int> styleCashe) { if (address.Start.Column == 0 || address.Start.Row == 0) { throw (new Exception("error address")); } //Columns else if (address.Start.Row == 1 && address.End.Row == ExcelPackage.MaxRows) { ExcelColumn column; int col = address.Start.Column, row = 0; bool isNew; //Get the startcolumn object o = null; if (!ws.ExistsValueInner(0, address.Start.Column, ref o)) { column = ws.Column(address.Start.Column); isNew = true; } else { //column = (ExcelColumn)ws.GetValueInner(0, address.Start.Column); column = (ExcelColumn)o; isNew = false; } var prevColumMax = column.ColumnMax; while (column.ColumnMin <= address.End.Column) { if (column.ColumnMin > prevColumMax + 1) { var newColumn = ws.Column(prevColumMax + 1); newColumn.ColumnMax = column.ColumnMin - 1; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } if (column.ColumnMax > address.End.Column) { var newCol = ws.CopyColumn(column, address.End.Column + 1, column.ColumnMax); column.ColumnMax = address.End.Column; } var s = ws.GetStyleInner(0, column.ColumnMin); AddNewStyleColumn(sender, e, ws, styleCashe, column, s); //index++; prevColumMax = column.ColumnMax; if (!ws._values.NextCell(ref row, ref col) || row > 0) { if (column._columnMax == address.End.Column) { break; } if (isNew) { column._columnMax = address.End.Column; } else { var newColumn = ws.Column(column._columnMax + 1); newColumn.ColumnMax = address.End.Column; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } break; } else { column = (ws.GetValueInner(0, col) as ExcelColumn); } } if (column._columnMax < address.End.Column) { var newCol = ws.Column(column._columnMax + 1) as ExcelColumn; newCol._columnMax = address.End.Column; var s = ws.GetStyleInner(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { ws.SetStyleInner(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyleInner(0, column.ColumnMin, newId); } column._columnMax = address.End.Column; } //Set for individual cells in the span. We loop all cells here since the cells are sorted with columns first. var cse = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, 1, address._fromCol, address._toRow, address._toCol); while (cse.Next()) { if (cse.Column >= address.Start.Column && cse.Column <= address.End.Column && cse.Value._styleId != 0) { if (styleCashe.ContainsKey(cse.Value._styleId)) { ws.SetStyleInner(cse.Row, cse.Column, styleCashe[cse.Value._styleId]); } else { ExcelXfs st = CellXfs[cse.Value._styleId]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value._styleId, newId); ws.SetStyleInner(cse.Row, cse.Column, newId); } } } if (!(address._fromCol == 1 && address._toCol == ExcelPackage.MaxColumns)) { //Update cells with styled columns cse = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, 1, 0, address._toRow, 0); while (cse.Next()) { if (cse.Value._styleId == 0) { continue; } for (int c = address._fromCol; c <= address._toCol; c++) { if (!ws.ExistsStyleInner(cse.Row, c)) { if (styleCashe.ContainsKey(cse.Value._styleId)) { ws.SetStyleInner(cse.Row, c, styleCashe[cse.Value._styleId]); } else { ExcelXfs st = CellXfs[cse.Value._styleId]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value._styleId, newId); ws.SetStyleInner(cse.Row, c, newId); } } } } } } //Rows else if (address.Start.Column == 1 && address.End.Column == ExcelPackage.MaxColumns) { for (int rowNum = address.Start.Row; rowNum <= address.End.Row; rowNum++) { var s = ws.GetStyleInner(rowNum, 0); if (s == 0) { //iterate all columns and set the row to the style of the last column var cse = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, 0, 1, 0, ExcelPackage.MaxColumns); while (cse.Next()) { s = cse.Value._styleId; if (s == 0) { continue; } var c = ws.GetValueInner(cse.Row, cse.Column) as ExcelColumn; if (c != null && c.ColumnMax < ExcelPackage.MaxColumns) { for (int col = c.ColumnMin; col < c.ColumnMax; col++) { if (!ws.ExistsStyleInner(rowNum, col)) { ws.SetStyleInner(rowNum, col, s); } } } } ws.SetStyleInner(rowNum, 0, s); cse.Dispose(); } if (styleCashe.ContainsKey(s)) { ws.SetStyleInner(rowNum, 0, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyleInner(rowNum, 0, newId); } } //Update individual cells var cse2 = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, address._fromRow, address._fromCol, address._toRow, address._toCol); while (cse2.Next()) { var s = cse2.Value._styleId; if (s == 0) { continue; } if (styleCashe.ContainsKey(s)) { ws.SetStyleInner(cse2.Row, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyleInner(cse2.Row, cse2.Column, newId); } } //Update cells with styled rows cse2 = new CellsStoreEnumerator <ExcelCoreValue>(ws._values, 0, 1, 0, address._toCol); while (cse2.Next()) { if (cse2.Value._styleId == 0) { continue; } for (int r = address._fromRow; r <= address._toRow; r++) { if (!ws.ExistsStyleInner(r, cse2.Column)) { var s = cse2.Value._styleId; if (styleCashe.ContainsKey(s)) { ws.SetStyleInner(r, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyleInner(r, cse2.Column, newId); } } } } } else //Cellrange { var tmpCache = styleCashe; var rowCache = new Dictionary <int, int>(address.End.Row - address.Start.Row + 1); var colCache = new Dictionary <int, ExcelCoreValue>(address.End.Column - address.Start.Column + 1); ws._values.SetRangeValueSpecial(address.Start.Row, address.Start.Column, address.End.Row, address.End.Column, (List <ExcelCoreValue> list, int index, int row, int column, object args) => { // Optimized GetStyleID var s = list[index]._styleId; if (s == 0 && !ws.ExistsStyleInner(row, 0, ref s)) { // get row styleId with cache if (!rowCache.ContainsKey(row)) { rowCache.Add(row, ws._values.GetValue(row, 0)._styleId); } s = rowCache[row]; if (s == 0) { // get column styleId with cache if (!colCache.ContainsKey(column)) { colCache.Add(column, ws._values.GetValue(0, column)); } s = colCache[column]._styleId; if (s == 0) { int r = 0, c = column; if (ws._values.PrevCell(ref r, ref c)) { //var val = ws._values.GetValue(0, c); if (!colCache.ContainsKey(c)) { colCache.Add(c, ws._values.GetValue(0, c)); } var val = colCache[c]; var colObj = (ExcelColumn)(val._value); if (colObj != null && colObj.ColumnMax >= column) //Fixes issue 15174 { s = val._styleId; } } } } } if (tmpCache.ContainsKey(s)) { //ws.SetStyleInner(row, column, tmpCache[s]); list[index] = new ExcelCoreValue { _value = list[index]._value, _styleId = tmpCache[s] }; } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); tmpCache.Add(s, newId); //ws.SetStyleInner(row, column, newId); list[index] = new ExcelCoreValue { _value = list[index]._value, _styleId = newId }; } }, e); } }
private void SetStyleAddress(StyleBase sender, Style.StyleChangeEventArgs e, ExcelAddressBase address, ExcelWorksheet ws, ref Dictionary <int, int> styleCashe) { if (address.Start.Column == 0 || address.Start.Row == 0) { throw (new Exception("error address")); } //Columns else if (address.Start.Row == 1 && address.End.Row == ExcelPackage.MaxRows) { ExcelColumn column; int col = address.Start.Column, row = 0; //Get the startcolumn //ulong colID = ExcelColumn.GetColumnID(ws.SheetID, address.Start.Column); if (!ws._values.Exists(0, address.Start.Column)) { column = ws.Column(address.Start.Column); } else { column = ws._values.GetValue(0, address.Start.Column) as ExcelColumn; } //var index = ws._columns.IndexOf(colID); while (column.ColumnMin <= address.End.Column) { if (column.ColumnMax > address.End.Column) { var newCol = ws.CopyColumn(column, address.End.Column + 1, column.ColumnMax); column.ColumnMax = address.End.Column; } var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { //column.StyleID = styleCashe[s]; ws._styles.SetValue(0, column.ColumnMin, styleCashe[s]); ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); //column.StyleID = newId; ws.SetStyle(0, column.ColumnMin, newId); } //index++; if (!ws._values.NextCell(ref row, ref col) || row > 0) { column._columnMax = address.End.Column; break; } else { column = (ws._values.GetValue(0, col) as ExcelColumn); } } if (column._columnMax < address.End.Column) { var newCol = ws.Column(column._columnMax + 1) as ExcelColumn; newCol._columnMax = address.End.Column; var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { //newCol.StyleID = styleCashe[s]; //ws._styles.SetValue(0, column.ColumnMin, styleCashe[s]); ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); //newCol.StyleID = newId; ws.SetStyle(0, column.ColumnMin, newId); } column._columnMax = address.End.Column; } //Set for individual cells in the span. We loop all cells here since the cells are sorted with columns first. var cse = new CellsStoreEnumerator <int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); while (cse.Next()) { if (cse.Column >= address.Start.Column && cse.Column <= address.End.Column) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, cse.Column, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); //cse.Value = newId; ws.SetStyle(cse.Row, cse.Column, newId); } } } } //Rows else if (address.Start.Column == 1 && address.End.Column == ExcelPackage.MaxColumns) { for (int rowNum = address.Start.Row; rowNum <= address.End.Row; rowNum++) { //ExcelRow row = ws.Row(rowNum); var s = ws._styles.GetValue(rowNum, 0); if (s == 0) { //iteratte all columns and set the row to the style of the last column var cse = new CellsStoreEnumerator <int>(ws._styles, 0, 1, 0, ExcelPackage.MaxColumns); while (cse.Next()) { s = cse.Value; var c = ws._values.GetValue(cse.Row, cse.Column) as ExcelColumn; if (c != null && c.ColumnMax < ExcelPackage.MaxColumns) { for (int col = c.ColumnMin; col < c.ColumnMax; col++) { if (!ws._styles.Exists(rowNum, col)) { ws._styles.SetValue(rowNum, col, s); } } } } ws.SetStyle(rowNum, 0, s); cse.Dispose(); } if (styleCashe.ContainsKey(s)) { ws.SetStyle(rowNum, 0, styleCashe[s]); //row.StyleID = styleCashe[s]; } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws._styles.SetValue(rowNum, 0, newId); ws.SetStyle(rowNum, 0, newId); } } //Get Start Cell //ulong rowID = ExcelRow.GetRowID(ws.SheetID, address.Start.Row); //int index = ws._cells.IndexOf(rowID); //index = ~index; var cse2 = new CellsStoreEnumerator <int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); //while (index < ws._cells.Count) while (cse2.Next()) { //var cell = ws._cells[index] as ExcelCell; //if(cell.Row > address.End.Row) //{ // break; //} var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(cse2.Row, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); cse2.Value = newId; ws.SetStyle(cse2.Row, cse2.Column, newId); } } } else //Cellrange { //var cse = new CellsStoreEnumerator<int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); //while(cse.Next()) for (int col = address.Start.Column; col <= address.End.Column; col++) { for (int row = address.Start.Row; row <= address.End.Row; row++) { //ExcelCell cell = ws.Cell(row, col); //int s = ws._styles.GetValue(row, col); var s = GetStyleId(ws, row, col); if (styleCashe.ContainsKey(s)) { ws.SetStyle(row, col, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(row, col, newId); } } } } }
/// <summary> /// Removes the comment /// </summary> /// <param name="comment">The comment to remove</param> public void Remove(ExcelComment comment) { ulong id = ExcelAddress.GetCellID(Worksheet.SheetID, comment.Range._fromRow, comment.Range._fromCol); //int ix=_comments.IndexOf(id); int i = -1; ExcelComment c=null; if (Worksheet._commentsStore.Exists(comment.Range._fromRow, comment.Range._fromCol, ref i)) { c = _list[i]; } if (comment==c) { comment.TopNode.ParentNode.RemoveChild(comment.TopNode); //Remove VML comment._commentHelper.TopNode.ParentNode.RemoveChild(comment._commentHelper.TopNode); //Remove Comment Worksheet.VmlDrawingsComments._drawings.Delete(id); _list.RemoveAt(i); Worksheet._commentsStore.Delete(comment.Range._fromRow, comment.Range._fromCol, 1, 1); var ci = new CellsStoreEnumerator<int>(Worksheet._commentsStore); while(ci.Next()) { if(ci.Value>i) { ci.Value -= 1; } } } else { throw (new ArgumentException("Comment does not exist in the worksheet")); } }
private void SetStyleAddress(StyleBase sender, Style.StyleChangeEventArgs e, ExcelAddressBase address, ExcelWorksheet ws, ref Dictionary <int, int> styleCashe) { if (address.Start.Column == 0 || address.Start.Row == 0) { throw (new Exception("error address")); } //Columns else if (address.Start.Row == 1 && address.End.Row == ExcelPackage.MaxRows) { ExcelColumn column; int col = address.Start.Column, row = 0; bool isNew; //Get the startcolumn if (!ws._values.Exists(0, address.Start.Column)) { column = ws.Column(address.Start.Column); isNew = true; } else { column = (ExcelColumn)ws._values.GetValue(0, address.Start.Column); isNew = false; } var prevColumMax = column.ColumnMax; while (column.ColumnMin <= address.End.Column) { if (column.ColumnMin > prevColumMax + 1) { var newColumn = ws.Column(prevColumMax + 1); newColumn.ColumnMax = column.ColumnMin - 1; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } if (column.ColumnMax > address.End.Column) { var newCol = ws.CopyColumn(column, address.End.Column + 1, column.ColumnMax); column.ColumnMax = address.End.Column; } var s = ws._styles.GetValue(0, column.ColumnMin); AddNewStyleColumn(sender, e, ws, styleCashe, column, s); //index++; prevColumMax = column.ColumnMax; if (!ws._values.NextCell(ref row, ref col) || row > 0) { if (column._columnMax == address.End.Column) { break; } if (isNew) { column._columnMax = address.End.Column; } else { var newColumn = ws.Column(column._columnMax + 1); newColumn.ColumnMax = address.End.Column; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } break; } else { column = (ws._values.GetValue(0, col) as ExcelColumn); } } if (column._columnMax < address.End.Column) { var newCol = ws.Column(column._columnMax + 1) as ExcelColumn; newCol._columnMax = address.End.Column; var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(0, column.ColumnMin, newId); } column._columnMax = address.End.Column; } //Set for individual cells in the span. We loop all cells here since the cells are sorted with columns first. var cse = new CellsStoreEnumerator <int>(ws._styles, 1, address._fromCol, address._toRow, address._toCol); while (cse.Next()) { if (cse.Column >= address.Start.Column && cse.Column <= address.End.Column) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, cse.Column, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); cse.Value = newId; //ws.SetStyle(cse.Row, cse.Column, newId); } } } if (!(address._fromCol == 1 && address._toCol == ExcelPackage.MaxColumns)) { //Update cells with styled columns cse = new CellsStoreEnumerator <int>(ws._styles, 1, 0, address._toRow, 0); while (cse.Next()) { for (int c = address._fromRow; c <= address._toCol; c++) { if (!ws._styles.Exists(cse.Row, c)) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, c, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); ws.SetStyle(cse.Row, c, newId); } } } } } } //Rows else if (address.Start.Column == 1 && address.End.Column == ExcelPackage.MaxColumns) { for (int rowNum = address.Start.Row; rowNum <= address.End.Row; rowNum++) { var s = ws._styles.GetValue(rowNum, 0); if (s == 0) { //iterate all columns and set the row to the style of the last column var cse = new CellsStoreEnumerator <int>(ws._styles, 0, 1, 0, ExcelPackage.MaxColumns); while (cse.Next()) { s = cse.Value; var c = ws._values.GetValue(cse.Row, cse.Column) as ExcelColumn; if (c != null && c.ColumnMax < ExcelPackage.MaxColumns) { for (int col = c.ColumnMin; col < c.ColumnMax; col++) { if (!ws._styles.Exists(rowNum, col)) { ws._styles.SetValue(rowNum, col, s); } } } } ws.SetStyle(rowNum, 0, s); cse.Dispose(); } if (styleCashe.ContainsKey(s)) { ws.SetStyle(rowNum, 0, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws._styles.SetValue(rowNum, 0, newId); ws.SetStyle(rowNum, 0, newId); } } //Update individual cells var cse2 = new CellsStoreEnumerator <int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); while (cse2.Next()) { var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(cse2.Row, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); cse2.Value = newId; } } //Update cells with styled rows cse2 = new CellsStoreEnumerator <int>(ws._styles, 0, 1, 0, address._toCol); while (cse2.Next()) { for (int r = address._fromRow; r <= address._toRow; r++) { if (!ws._styles.Exists(r, cse2.Column)) { var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(r, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(r, cse2.Column, newId); } } } } } else //Cellrange { for (int col = address.Start.Column; col <= address.End.Column; col++) { for (int row = address.Start.Row; row <= address.End.Row; row++) { var s = GetStyleId(ws, row, col); if (styleCashe.ContainsKey(s)) { ws.SetStyle(row, col, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(row, col, newId); } } } } }
private void SetStyleAddress(StyleBase sender, Style.StyleChangeEventArgs e, ExcelAddressBase address, ExcelWorksheet ws, ref Dictionary<int, int> styleCashe) { if (address.Start.Column == 0 || address.Start.Row == 0) { throw (new Exception("error address")); } //Columns else if (address.Start.Row == 1 && address.End.Row == ExcelPackage.MaxRows) { ExcelColumn column; int col = address.Start.Column, row = 0; //Get the startcolumn //ulong colID = ExcelColumn.GetColumnID(ws.SheetID, address.Start.Column); if (!ws._values.Exists(0, address.Start.Column)) { column = ws.Column(address.Start.Column); } else { column = ws._values.GetValue(0, address.Start.Column) as ExcelColumn; } //var index = ws._columns.IndexOf(colID); while (column.ColumnMin <= address.End.Column) { if (column.ColumnMax > address.End.Column) { var newCol = ws.CopyColumn(column, address.End.Column + 1, column.ColumnMax); column.ColumnMax = address.End.Column; } var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { //column.StyleID = styleCashe[s]; ws._styles.SetValue(0, column.ColumnMin, styleCashe[s]); ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); //column.StyleID = newId; ws.SetStyle(0, column.ColumnMin, newId); } //index++; if (!ws._values.NextCell(ref row, ref col) || row > 0) { column._columnMax = address.End.Column; break; } else { column = (ws._values.GetValue(0, col) as ExcelColumn); } } if (column._columnMax < address.End.Column) { var newCol = ws.Column(column._columnMax + 1) as ExcelColumn; newCol._columnMax = address.End.Column; var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { //newCol.StyleID = styleCashe[s]; //ws._styles.SetValue(0, column.ColumnMin, styleCashe[s]); ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); //newCol.StyleID = newId; ws.SetStyle(0, column.ColumnMin, newId); } column._columnMax = address.End.Column; } //Set for individual cells in the span. We loop all cells here since the cells are sorted with columns first. var cse = new CellsStoreEnumerator<int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); while (cse.Next()) { if (cse.Column >= address.Start.Column && cse.Column <= address.End.Column) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, cse.Column, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); //cse.Value = newId; ws.SetStyle(cse.Row, cse.Column, newId); } } } } //Rows else if (address.Start.Column == 1 && address.End.Column == ExcelPackage.MaxColumns) { for (int rowNum = address.Start.Row; rowNum <= address.End.Row; rowNum++) { //ExcelRow row = ws.Row(rowNum); var s = ws._styles.GetValue(rowNum, 0); if (s == 0) { //iteratte all columns and set the row to the style of the last column var cse = new CellsStoreEnumerator<int>(ws._styles, 0, 1, 0, ExcelPackage.MaxColumns); while (cse.Next()) { s = cse.Value; var c = ws._values.GetValue(cse.Row, cse.Column) as ExcelColumn; if (c != null && c.ColumnMax < ExcelPackage.MaxColumns) { for (int col = c.ColumnMin; col < c.ColumnMax; col++) { if (!ws._styles.Exists(rowNum, col)) { ws._styles.SetValue(rowNum, col, s); } } } } ws.SetStyle(rowNum, 0, s); cse.Dispose(); } if (styleCashe.ContainsKey(s)) { ws.SetStyle(rowNum, 0, styleCashe[s]); //row.StyleID = styleCashe[s]; } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws._styles.SetValue(rowNum, 0, newId); ws.SetStyle(rowNum, 0, newId); } } //Get Start Cell //ulong rowID = ExcelRow.GetRowID(ws.SheetID, address.Start.Row); //int index = ws._cells.IndexOf(rowID); //index = ~index; var cse2 = new CellsStoreEnumerator<int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); //while (index < ws._cells.Count) while (cse2.Next()) { //var cell = ws._cells[index] as ExcelCell; //if(cell.Row > address.End.Row) //{ // break; //} var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(cse2.Row, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); cse2.Value = newId; ws.SetStyle(cse2.Row, cse2.Column, newId); } } } else //Cellrange { //var cse = new CellsStoreEnumerator<int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); //while(cse.Next()) for (int col = address.Start.Column; col <= address.End.Column; col++) { for (int row = address.Start.Row; row <= address.End.Row; row++) { //ExcelCell cell = ws.Cell(row, col); //int s = ws._styles.GetValue(row, col); var s = GetStyleId(ws, row, col); if (styleCashe.ContainsKey(s)) { ws.SetStyle(row, col, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(row, col, newId); } } } } }
private double GetRowHeightFromCellFonts(int row, ExcelWorksheet ws) { var dh = ws.DefaultRowHeight; if (double.IsNaN(dh) || ws.CustomHeight==false) { var height = dh; var cse = new CellsStoreEnumerator<ExcelCoreValue>(_drawings.Worksheet._values, row, 0, row, ExcelPackage.MaxColumns); var styles = _drawings.Worksheet.Workbook.Styles; while (cse.Next()) { var xfs = styles.CellXfs[cse.Value._styleId]; var f = styles.Fonts[xfs.FontId]; var rh = ExcelFontXml.GetFontHeight(f.Name, f.Size) * 0.75; if (rh > height) { height = rh; } } return height; } else { return dh; } }
public RangeInfo(ExcelWorksheet ws, ExcelAddressBase address) { _ws = ws; _fromRow = address._fromRow; _fromCol = address._fromCol; _toRow = address._toRow; _toCol = address._toCol; _address = address; _address._ws = ws.Name; _values = new CellsStoreEnumerator<ExcelCoreValue>(ws._values, _fromRow, _fromCol, _toRow, _toCol); _cell = new CellInfo(_ws, _values); }
private void RemoveUnusedStyles() { CellXfs[0].useCnt = 1; //First item is always used. foreach (ExcelWorksheet sheet in _wb.Worksheets) { var cse = new CellsStoreEnumerator <ExcelCoreValue>(sheet._values); while (cse.Next()) { var v = cse.Value._styleId; if (v >= 0) { CellXfs[v].useCnt++; } } } foreach (ExcelNamedStyleXml ns in NamedStyles) { CellStyleXfs[ns.StyleXfId].useCnt++; } foreach (ExcelXfs xf in CellXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) { Fonts[xf.FontId].useCnt++; } if (xf.FillId >= 0) { Fills[xf.FillId].useCnt++; } if (xf.BorderId >= 0) { Borders[xf.BorderId].useCnt++; } } } foreach (ExcelXfs xf in CellStyleXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) { Fonts[xf.FontId].useCnt++; } if (xf.FillId >= 0) { Fills[xf.FillId].useCnt++; } if (xf.BorderId >= 0) { Borders[xf.BorderId].useCnt++; } } } }
internal CellInfo(ExcelWorksheet ws, CellsStoreEnumerator <ExcelCoreValue> values) { _ws = ws; _values = values; }
internal CellInfo(ExcelWorksheet ws, CellsStoreEnumerator<object> values) { _ws = ws; _values = values; }
private void RemoveUnusedStyles() { CellXfs[0].useCnt = 1; //First item is allways used. //var r, c; foreach (ExcelWorksheet sheet in _wb.Worksheets) { var cse = new CellsStoreEnumerator<int>(sheet._styles); while(cse.Next()) { //CellXfs[cell.GetCellStyleID()].useCnt++; CellXfs[cse.Value].useCnt++; } //foreach(ExcelRow row in sheet._rows) //{ // CellXfs[row.StyleID].useCnt++; //} //foreach (ExcelColumn col in sheet._columns) //{ // if(col.StyleID>=0) CellXfs[col.StyleID].useCnt++; //} } foreach (ExcelNamedStyleXml ns in NamedStyles) { CellStyleXfs[ns.StyleXfId].useCnt++; } foreach (ExcelXfs xf in CellXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) Fonts[xf.FontId].useCnt++; if (xf.FillId >= 0) Fills[xf.FillId].useCnt++; if (xf.BorderId >= 0) Borders[xf.BorderId].useCnt++; } } foreach (ExcelXfs xf in CellStyleXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) Fonts[xf.FontId].useCnt++; if (xf.FillId >= 0) Fills[xf.FillId].useCnt++; if (xf.BorderId >= 0) Borders[xf.BorderId].useCnt++; } } }
private void RemoveUnusedStyles() { CellXfs[0].useCnt = 1; //First item is allways used. foreach (ExcelWorksheet sheet in _wb.Worksheets) { var cse = new CellsStoreEnumerator<int>(sheet._styles); while(cse.Next()) { var v = cse.Value; if (v >= 0) { CellXfs[v].useCnt++; } } } foreach (ExcelNamedStyleXml ns in NamedStyles) { CellStyleXfs[ns.StyleXfId].useCnt++; } foreach (ExcelXfs xf in CellXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) Fonts[xf.FontId].useCnt++; if (xf.FillId >= 0) Fills[xf.FillId].useCnt++; if (xf.BorderId >= 0) Borders[xf.BorderId].useCnt++; } } foreach (ExcelXfs xf in CellStyleXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) Fonts[xf.FontId].useCnt++; if (xf.FillId >= 0) Fills[xf.FillId].useCnt++; if (xf.BorderId >= 0) Borders[xf.BorderId].useCnt++; } } }
private void RemoveUnusedStyles() { CellXfs[0].useCnt = 1; //First item is allways used. //var r, c; foreach (ExcelWorksheet sheet in _wb.Worksheets) { var cse = new CellsStoreEnumerator <int>(sheet._styles); while (cse.Next()) { //CellXfs[cell.GetCellStyleID()].useCnt++; CellXfs[cse.Value].useCnt++; } //foreach(ExcelRow row in sheet._rows) //{ // CellXfs[row.StyleID].useCnt++; //} //foreach (ExcelColumn col in sheet._columns) //{ // if(col.StyleID>=0) CellXfs[col.StyleID].useCnt++; //} } foreach (ExcelNamedStyleXml ns in NamedStyles) { CellStyleXfs[ns.StyleXfId].useCnt++; } foreach (ExcelXfs xf in CellXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) { Fonts[xf.FontId].useCnt++; } if (xf.FillId >= 0) { Fills[xf.FillId].useCnt++; } if (xf.BorderId >= 0) { Borders[xf.BorderId].useCnt++; } } } foreach (ExcelXfs xf in CellStyleXfs) { if (xf.useCnt > 0) { if (xf.FontId >= 0) { Fonts[xf.FontId].useCnt++; } if (xf.FillId >= 0) { Fills[xf.FillId].useCnt++; } if (xf.BorderId >= 0) { Borders[xf.BorderId].useCnt++; } } } }
private static void GetChain(DependencyChain depChain, ILexer lexer, ExcelRangeBase Range, ExcelCalculationOption options) { var ws = Range.Worksheet; var fs = new CellsStoreEnumerator<object>(ws._formulas, Range.Start.Row, Range.Start.Column, Range.End.Row, Range.End.Column); while (fs.Next()) { if (fs.Value == null || fs.Value.ToString().Trim() == "") continue; var id = ExcelCellBase.GetCellID(ws.SheetID, fs.Row, fs.Column); if (!depChain.index.ContainsKey(id)) { var f = new FormulaCell() { SheetID = ws.SheetID, Row = fs.Row, Column = fs.Column }; if (fs.Value is int) { f.Formula = ws._sharedFormulas[(int)fs.Value].GetFormula(fs.Row, fs.Column, ws.Name); } else { f.Formula = fs.Value.ToString(); } if (!string.IsNullOrEmpty(f.Formula)) { f.Tokens = lexer.Tokenize(f.Formula, Range.Worksheet.Name).ToList(); ws._formulaTokens.SetValue(fs.Row, fs.Column, f.Tokens); depChain.Add(f); FollowChain(depChain, lexer, ws.Workbook, ws, f, options); } } } }
private void SetStyleAddress(StyleBase sender, Style.StyleChangeEventArgs e, ExcelAddressBase address, ExcelWorksheet ws, ref Dictionary<int, int> styleCashe) { if (address.Start.Column == 0 || address.Start.Row == 0) { throw (new Exception("error address")); } //Columns else if (address.Start.Row == 1 && address.End.Row == ExcelPackage.MaxRows) { ExcelColumn column; int col = address.Start.Column, row = 0; bool isNew; //Get the startcolumn if (!ws._values.Exists(0, address.Start.Column)) { column = ws.Column(address.Start.Column); isNew = true; } else { column = (ExcelColumn)ws._values.GetValue(0, address.Start.Column); isNew = false; } var prevColumMax = column.ColumnMax; while (column.ColumnMin <= address.End.Column) { if(column.ColumnMin > prevColumMax+1) { var newColumn = ws.Column(prevColumMax + 1); newColumn.ColumnMax = column.ColumnMin-1; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } if (column.ColumnMax > address.End.Column) { var newCol = ws.CopyColumn(column, address.End.Column + 1, column.ColumnMax); column.ColumnMax = address.End.Column; } var s = ws._styles.GetValue(0, column.ColumnMin); AddNewStyleColumn(sender, e, ws, styleCashe, column, s); //index++; prevColumMax = column.ColumnMax; if (!ws._values.NextCell(ref row, ref col) || row > 0) { if(column._columnMax == address.End.Column) { break; } if (isNew) { column._columnMax = address.End.Column; } else { var newColumn = ws.Column(column._columnMax + 1); newColumn.ColumnMax = address.End.Column; AddNewStyleColumn(sender, e, ws, styleCashe, newColumn, newColumn.StyleID); } break; } else { column = (ws._values.GetValue(0, col) as ExcelColumn); } } if (column._columnMax < address.End.Column) { var newCol = ws.Column(column._columnMax + 1) as ExcelColumn; newCol._columnMax = address.End.Column; var s = ws._styles.GetValue(0, column.ColumnMin); if (styleCashe.ContainsKey(s)) { ws.SetStyle(0, column.ColumnMin, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(0, column.ColumnMin, newId); } column._columnMax = address.End.Column; } //Set for individual cells in the span. We loop all cells here since the cells are sorted with columns first. var cse = new CellsStoreEnumerator<int>(ws._styles, 1, address._fromCol, address._toRow, address._toCol); while (cse.Next()) { if (cse.Column >= address.Start.Column && cse.Column <= address.End.Column) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, cse.Column, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); cse.Value = newId; //ws.SetStyle(cse.Row, cse.Column, newId); } } } if (!(address._fromCol == 1 && address._toCol == ExcelPackage.MaxColumns)) { //Update cells with styled columns cse = new CellsStoreEnumerator<int>(ws._styles, 1, 0, address._toRow, 0); while (cse.Next()) { for (int c = address._fromRow; c <= address._toCol; c++) { if (!ws._styles.Exists(cse.Row, c)) { if (styleCashe.ContainsKey(cse.Value)) { ws.SetStyle(cse.Row, c, styleCashe[cse.Value]); } else { ExcelXfs st = CellXfs[cse.Value]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(cse.Value, newId); ws.SetStyle(cse.Row, c, newId); } } } } } } //Rows else if (address.Start.Column == 1 && address.End.Column == ExcelPackage.MaxColumns) { for (int rowNum = address.Start.Row; rowNum <= address.End.Row; rowNum++) { var s = ws._styles.GetValue(rowNum, 0); if (s == 0) { //iterate all columns and set the row to the style of the last column var cse = new CellsStoreEnumerator<int>(ws._styles, 0, 1, 0, ExcelPackage.MaxColumns); while (cse.Next()) { s = cse.Value; var c = ws._values.GetValue(cse.Row, cse.Column) as ExcelColumn; if (c != null && c.ColumnMax < ExcelPackage.MaxColumns) { for (int col = c.ColumnMin; col < c.ColumnMax; col++) { if (!ws._styles.Exists(rowNum, col)) { ws._styles.SetValue(rowNum, col, s); } } } } ws.SetStyle(rowNum, 0, s); cse.Dispose(); } if (styleCashe.ContainsKey(s)) { ws.SetStyle(rowNum, 0, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws._styles.SetValue(rowNum, 0, newId); ws.SetStyle(rowNum, 0, newId); } } //Update individual cells var cse2 = new CellsStoreEnumerator<int>(ws._styles, address._fromRow, address._fromCol, address._toRow, address._toCol); while (cse2.Next()) { var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(cse2.Row, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); cse2.Value = newId; } } //Update cells with styled rows cse2 = new CellsStoreEnumerator<int>(ws._styles, 0, 1, 0, address._toCol); while (cse2.Next()) { for (int r = address._fromRow; r <= address._toRow; r++) { if (!ws._styles.Exists(r, cse2.Column)) { var s = cse2.Value; if (styleCashe.ContainsKey(s)) { ws.SetStyle(r, cse2.Column, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(r, cse2.Column, newId); } } } } } else //Cellrange { for (int col = address.Start.Column; col <= address.End.Column; col++) { for (int row = address.Start.Row; row <= address.End.Row; row++) { var s = GetStyleId(ws, row, col); if (styleCashe.ContainsKey(s)) { ws.SetStyle(row, col, styleCashe[s]); } else { ExcelXfs st = CellXfs[s]; int newId = st.GetNewID(CellXfs, sender, e.StyleClass, e.StyleProperty, e.Value); styleCashe.Add(s, newId); ws.SetStyle(row, col, newId); } } } } }