diff --git a/ClosedXML/ClosedXML/ClosedXML.sln b/ClosedXML/ClosedXML/ClosedXML.sln index e99f58b..871b2e4 100644 --- a/ClosedXML/ClosedXML/ClosedXML.sln +++ b/ClosedXML/ClosedXML/ClosedXML.sln @@ -11,9 +11,11 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClosedXML_Net3.5", "ClosedXML_Net3.5\ClosedXML_Net3.5.csproj", "{5F43B12B-A900-40C6-9924-A0C0B032F791}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ClosedXML_Sandbox_VB", "ClosedXML_Sandbox_VB\ClosedXML_Sandbox_VB.vbproj", "{E005997D-B192-461F-AA3E-44007A33A3DF}" +EndProject Global GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 5 + SccNumberOfProjects = 6 SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs09 SccLocalPath0 = . @@ -29,6 +31,9 @@ SccProjectUniqueName4 = ClosedXML_Net3.5\\ClosedXML_Net3.5.csproj SccProjectName4 = ClosedXML_Net3.5 SccLocalPath4 = ClosedXML_Net3.5 + SccProjectUniqueName5 = ClosedXML_Sandbox_VB\\ClosedXML_Sandbox_VB.vbproj + SccProjectName5 = ClosedXML_Sandbox_VB + SccLocalPath5 = ClosedXML_Sandbox_VB EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = ClosedXML.vsmdi @@ -82,6 +87,16 @@ {5F43B12B-A900-40C6-9924-A0C0B032F791}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {5F43B12B-A900-40C6-9924-A0C0B032F791}.Release|Mixed Platforms.Build.0 = Release|Any CPU {5F43B12B-A900-40C6-9924-A0C0B032F791}.Release|x86.ActiveCfg = Release|Any CPU + {E005997D-B192-461F-AA3E-44007A33A3DF}.Debug|Any CPU.ActiveCfg = Debug|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Debug|x86.ActiveCfg = Debug|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Debug|x86.Build.0 = Debug|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Release|Any CPU.ActiveCfg = Release|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Release|Mixed Platforms.Build.0 = Release|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Release|x86.ActiveCfg = Release|x86 + {E005997D-B192-461F-AA3E-44007A33A3DF}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index 70e02b3..95523d7 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -428,9 +428,9 @@ if (Style.NumberFormat.Format == String.Empty && Style.NumberFormat.NumberFormatId == 0) if (cellValue.Contains('.')) - Style.NumberFormat.NumberFormatId = 14; - else Style.NumberFormat.NumberFormatId = 22; + else + Style.NumberFormat.NumberFormatId = 14; } else if (value == XLCellValues.TimeSpan) { @@ -579,12 +579,12 @@ private String GetFormulaR1C1(String value) { - return GetFormula(value, FormulaConversionType.A1toR1C1); + return GetFormula(value, FormulaConversionType.A1toR1C1, 0, 0); } private String GetFormulaA1(String value) { - return GetFormula(value, FormulaConversionType.R1C1toA1); + return GetFormula(value, FormulaConversionType.R1C1toA1, 0, 0); } private enum FormulaConversionType { A1toR1C1, R1C1toA1 }; @@ -597,7 +597,7 @@ @"(?<=\W)([Rr]\[?-?\d{0,7}\]?[Cc]\[?-?\d{0,7}\]?)(?=\W)" // R1C1 + @"|(?<=\W)([Rr]\[?-?\d{0,7}\]?:[Rr]\[?-?\d{0,7}\]?)(?=\W)" // R:R + @"|(?<=\W)([Cc]\[?-?\d{0,5}\]?:[Cc]\[?-?\d{0,5}\]?)(?=\W)"); // C:C - private String GetFormula(String strValue, FormulaConversionType conversionType) + private String GetFormula(String strValue, FormulaConversionType conversionType, Int32 rowsToShift, Int32 columnsToShift) { if (StringExtensions.IsNullOrWhiteSpace(strValue)) return String.Empty; @@ -617,9 +617,9 @@ { sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); if (conversionType == FormulaConversionType.A1toR1C1) - sb.Append(GetR1C1Address(matchString)); + sb.Append(GetR1C1Address(matchString, rowsToShift, columnsToShift)); else - sb.Append(GetA1Address(matchString)); + sb.Append(GetA1Address(matchString, rowsToShift, columnsToShift)); } else { @@ -634,7 +634,7 @@ return retVal.Substring(1, retVal.Length - 2); } - private String GetA1Address(String r1c1Address) + private String GetA1Address(String r1c1Address, Int32 rowsToShift, Int32 columnsToShift) { var addressToUse = r1c1Address.ToUpper(); @@ -647,13 +647,13 @@ String rightPart; if (p1.StartsWith("R")) { - leftPart = GetA1Row(p1); - rightPart = GetA1Row(p2); + leftPart = GetA1Row(p1, rowsToShift); + rightPart = GetA1Row(p2, rowsToShift); } else { - leftPart = GetA1Column(p1); - rightPart = GetA1Column(p2); + leftPart = GetA1Column(p1, columnsToShift); + rightPart = GetA1Column(p2, columnsToShift); } return leftPart + ":" + rightPart; } @@ -661,55 +661,55 @@ { var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); - String rowToReturn = GetA1Row(rowPart); + String rowToReturn = GetA1Row(rowPart, rowsToShift); var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); - String columnToReturn = GetA1Column(columnPart); + String columnToReturn = GetA1Column(columnPart, columnsToShift); var retAddress = columnToReturn + rowToReturn; return retAddress; } } - private String GetA1Column(String columnPart) + private String GetA1Column(String columnPart, Int32 columnsToShift) { String columnToReturn; if (columnPart == "C") { - columnToReturn = Address.ColumnLetter; + columnToReturn = XLAddress.GetColumnLetterFromNumber(Address.ColumnNumber + columnsToShift); } else { var bIndex = columnPart.IndexOf("["); if (bIndex >= 0) columnToReturn = XLAddress.GetColumnLetterFromNumber( - Address.ColumnNumber + Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + Address.ColumnNumber + Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + columnsToShift ); else - columnToReturn = "$" + XLAddress.GetColumnLetterFromNumber(Int32.Parse(columnPart.Substring(1))); + columnToReturn = "$" + XLAddress.GetColumnLetterFromNumber(Int32.Parse(columnPart.Substring(1)) + columnsToShift); } return columnToReturn; } - private String GetA1Row(String rowPart) + private String GetA1Row(String rowPart, Int32 rowsToShift) { String rowToReturn; if (rowPart == "R") { - rowToReturn = Address.RowNumber.ToString(); + rowToReturn = (Address.RowNumber + rowsToShift).ToString(); } else { var bIndex = rowPart.IndexOf("["); if (bIndex >= 0) - rowToReturn = (Address.RowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2))).ToString(); + rowToReturn = (Address.RowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + rowsToShift).ToString(); else - rowToReturn = "$" + rowPart.Substring(1); + rowToReturn = "$" + (Int32.Parse(rowPart.Substring(1)) + rowsToShift).ToString(); } return rowToReturn; } - private String GetR1C1Address(String a1Address) + private String GetR1C1Address(String a1Address, Int32 rowsToShift, Int32 columnsToShift) { if (a1Address.Contains(':')) { @@ -720,16 +720,16 @@ if (Int32.TryParse(p1.Replace("$", ""), out row1)) { var row2 = Int32.Parse(p2.Replace("$", "")); - var leftPart = GetR1C1Row(row1, p1.Contains('$')); - var rightPart = GetR1C1Row(row2, p2.Contains('$')); + var leftPart = GetR1C1Row(row1, p1.Contains('$'), rowsToShift); + var rightPart = GetR1C1Row(row2, p2.Contains('$'), rowsToShift); return leftPart + ":" + rightPart; } else { var column1 = XLAddress.GetColumnNumberFromLetter(p1.Replace("$", "")); var column2 = XLAddress.GetColumnNumberFromLetter(p2.Replace("$", "")); - var leftPart = GetR1C1Column(column1, p1.Contains('$')); - var rightPart = GetR1C1Column(column2, p2.Contains('$')); + var leftPart = GetR1C1Column(column1, p1.Contains('$'), columnsToShift); + var rightPart = GetR1C1Column(column2, p2.Contains('$'), columnsToShift); return leftPart + ":" + rightPart; } } @@ -737,16 +737,17 @@ { var address = new XLAddress(a1Address); - String rowPart = GetR1C1Row(address.RowNumber, address.FixedRow); - String columnPart = GetR1C1Column(address.ColumnNumber, address.FixedRow); + String rowPart = GetR1C1Row(address.RowNumber, address.FixedRow, rowsToShift); + String columnPart = GetR1C1Column(address.ColumnNumber, address.FixedRow, columnsToShift); return rowPart + columnPart; } } - private String GetR1C1Row(Int32 rowNumber, Boolean fixedRow) + private String GetR1C1Row(Int32 rowNumber, Boolean fixedRow, Int32 rowsToShift) { String rowPart; + rowNumber += rowsToShift; var rowDiff = rowNumber - Address.RowNumber; if (rowDiff != 0 || fixedRow) { @@ -761,9 +762,10 @@ return rowPart; } - private String GetR1C1Column(Int32 columnNumber, Boolean fixedColumn) + private String GetR1C1Column(Int32 columnNumber, Boolean fixedColumn, Int32 columnsToShift) { String columnPart; + columnNumber += columnsToShift; var columnDiff = columnNumber - Address.ColumnNumber; if (columnDiff != 0 || fixedColumn) { @@ -778,5 +780,20 @@ return columnPart; } + internal void CopyValues(XLCell source) + { + this.cellValue = source.cellValue; + this.dataType = source.dataType; + this.formulaA1 = source.formulaA1; + this.formulaR1C1 = source.formulaR1C1; + } + + internal void ShiftFormula(Int32 rowsToShift, Int32 columnsToShift) + { + if (!StringExtensions.IsNullOrWhiteSpace(formulaA1)) + FormulaR1C1 = GetFormula(formulaA1, FormulaConversionType.A1toR1C1, rowsToShift, columnsToShift); + else if (!StringExtensions.IsNullOrWhiteSpace(formulaA1)) + FormulaA1 = GetFormula(formulaA1, FormulaConversionType.R1C1toA1, rowsToShift, columnsToShift); + } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index b390ad3..052a058 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -278,8 +278,7 @@ oldCell = this.Worksheet.Cell(oldKey); } var newCell = new XLCell(newKey, oldCell.Style, Worksheet); - newCell.Value = oldCell.Value; - newCell.DataType = oldCell.DataType; + newCell.CopyValues((XLCell)oldCell); cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(oldKey); if (oldKey.ColumnNumber < firstColumn + numberOfColumns) @@ -299,8 +298,7 @@ var newColumn = c.Key.ColumnNumber + numberOfColumns; var newKey = new XLAddress(c.Key.RowNumber, newColumn); var newCell = new XLCell(newKey, c.Value.Style, Worksheet); - newCell.Value = c.Value.Value; - newCell.DataType = c.Value.DataType; + newCell.CopyValues(c.Value); cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(c.Key); if (c.Key.ColumnNumber < firstColumn + numberOfColumns) @@ -374,8 +372,7 @@ oldCell = this.Worksheet.Cell(oldKey); } var newCell = new XLCell(newKey, oldCell.Style, Worksheet); - newCell.Value = oldCell.Value; - newCell.DataType = oldCell.DataType; + newCell.CopyValues((XLCell)oldCell); cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(oldKey); if (oldKey.RowNumber < firstRow + numberOfRows) @@ -395,8 +392,7 @@ var newRow = c.Key.RowNumber + numberOfRows; var newKey = new XLAddress(newRow, c.Key.ColumnNumber); var newCell = new XLCell(newKey, c.Value.Style, Worksheet); - newCell.Value = c.Value.Value; - newCell.DataType = c.Value.DataType; + newCell.CopyValues(c.Value); cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(c.Key); if (c.Key.RowNumber < firstRow + numberOfRows) @@ -503,8 +499,8 @@ { var newKey = new XLAddress(c.Key.RowNumber - rowModifier, c.Key.ColumnNumber - columnModifier); var newCell = new XLCell(newKey, c.Value.Style, Worksheet); - newCell.Value = c.Value.Value; - newCell.DataType = c.Value.DataType; + newCell.CopyValues(c.Value); + newCell.ShiftFormula(rowModifier * -1, columnModifier * -1); cellsToDelete.Add(c.Key); var canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs index 3849c5f..39e9b68 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs @@ -230,18 +230,12 @@ System.Drawing.Font stringFont = new System.Drawing.Font(fontName, (float)fontSize); return GetWidth(stringFont, text); } - + private static readonly Graphics g = Graphics.FromImage(new Bitmap(200, 200)); private Double GetWidth(System.Drawing.Font stringFont, string text) { - // This formula is based on this article plus a nudge ( + 0.2M ) - // http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column.width.aspx - // Truncate(((256 * Solve_For_This + Truncate(128 / 7)) / 256) * 7) = DeterminePixelsOfString - String textToUse = new String('X', text.Length); - Size textSize = TextRenderer.MeasureText(textToUse, stringFont); - double width = (double)(((textSize.Width / (double)7) * 256) - (128 / 7)) / 256; - width = (double)decimal.Round((decimal)width + 0.2M, 2); - - return width; + System.Drawing.Font drawfont = new System.Drawing.Font(fontName, (float)fontSize); + Int32 charWidth = (Int32)g.MeasureString("X", drawfont).Width; + return 2 + Math.Truncate((text.Length * charWidth) / charWidth * 256.0) / 256.0 - 0.71; } public Double GetHeight() diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index 01f448e..ab816a5 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -149,7 +149,7 @@ } } - foreach (var row in worksheetPart.Worksheet.Descendants().Where(r => r.CustomFormat != null && r.CustomFormat).Select(r => r)) + foreach (var row in worksheetPart.Worksheet.Descendants()) //.Where(r => r.CustomFormat != null && r.CustomFormat).Select(r => r)) { var xlRow = ws.Row((Int32)row.RowIndex.Value, false); if (row.Height != null) @@ -248,7 +248,7 @@ } var printOptionsQuery = worksheetPart.Worksheet.Descendants(); - if (printOptionsQuery.Count() > 1) + if (printOptionsQuery.Count() > 0) { var printOptions = (PrintOptions)printOptionsQuery.First(); if (printOptions.GridLines != null) @@ -319,6 +319,8 @@ var headerFooter = (HeaderFooter)headerFooters.First(); if (headerFooter.AlignWithMargins != null) ws.PageSetup.AlignHFWithMargins = headerFooter.AlignWithMargins; + if (headerFooter.ScaleWithDoc != null) + ws.PageSetup.ScaleHFWithDocument = headerFooter.ScaleWithDoc; // Footers var xlFooter = (XLHeaderFooter)ws.PageSetup.Footer; diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index 2847748..e744f2f 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -13,7 +13,8 @@ using System.Text; using System.IO; using System.Globalization; -//using System.IO.Packaging; +using DRW = System.Drawing; + @@ -564,10 +565,10 @@ if (worksheet.PageSetup.PrintAreas.Count() == 0) { - var minCell = worksheet.Internals.CellsCollection.Min(c => c.Key); - var maxCell = worksheet.Internals.CellsCollection.Max(c => c.Key); + var minCell = worksheet.FirstCellUsed(); + var maxCell = worksheet.LastCellUsed(); if (minCell != null && maxCell != null) - worksheet.PageSetup.PrintAreas.Add(minCell, maxCell); + worksheet.PageSetup.PrintAreas.Add(minCell.Address.ToString(), maxCell.Address.ToString()); } if (worksheet.PageSetup.PrintAreas.Count() > 0) { @@ -623,7 +624,7 @@ if (titles.Length > 0) { - DefinedName definedName = new DefinedName() { Name = "_xlnm.Print_Titles", LocalSheetId = sheetId}; + DefinedName definedName = new DefinedName() { Name = "_xlnm.Print_Titles", LocalSheetId = sheetId }; definedName.Text = titles; definedNames.Append(definedName); } @@ -645,12 +646,19 @@ foreach (DefinedName dn in definedNames) { - if (workbook.DefinedNames.Elements().Any(d => d.Name.Value.ToLower() == dn.Name.Value.ToLower() - && ((d.LocalSheetId != null && dn.LocalSheetId !=null && d.LocalSheetId.InnerText == dn.LocalSheetId.InnerText) + if (workbook.DefinedNames.Elements().Any(d => + d.Name.Value.ToLower() == dn.Name.Value.ToLower() + && ( + (d.LocalSheetId != null && dn.LocalSheetId != null && d.LocalSheetId.InnerText == dn.LocalSheetId.InnerText) || d.LocalSheetId == null || dn.LocalSheetId == null) )) { - DefinedName existingDefinedName = (DefinedName)workbook.DefinedNames.Where(d => ((DefinedName)d).Name.Value.ToLower() == dn.Name.Value.ToLower()).First(); + DefinedName existingDefinedName = (DefinedName)workbook.DefinedNames.Where(d => + ((DefinedName)d).Name.Value.ToLower() == dn.Name.Value.ToLower() + && ( + (((DefinedName)d).LocalSheetId != null && dn.LocalSheetId != null && ((DefinedName)d).LocalSheetId.InnerText == dn.LocalSheetId.InnerText) + || ((DefinedName)d).LocalSheetId == null || dn.LocalSheetId == null) + ).First(); existingDefinedName.Text = dn.Text; existingDefinedName.LocalSheetId = dn.LocalSheetId; existingDefinedName.Comment = dn.Comment; @@ -1415,6 +1423,8 @@ } else { + var worksheetColumnWidth = GetColumnWidth(xlWorksheet.ColumnWidth); + if (worksheetPart.Worksheet.Elements().Count() == 0) worksheetPart.Worksheet.InsertAfter(new Columns(), worksheetPart.Worksheet.SheetFormatProperties); @@ -1446,7 +1456,7 @@ Min = co, Max = co, Style = styleId, - Width = xlWorksheet.ColumnWidth, + Width = worksheetColumnWidth, CustomWidth = true }; @@ -1464,7 +1474,7 @@ if (xlWorksheet.Internals.ColumnsCollection.ContainsKey(co)) { styleId = sharedStyles[xlWorksheet.Internals.ColumnsCollection[co].Style].StyleId; - columnWidth = xlWorksheet.Internals.ColumnsCollection[co].Width; + columnWidth = GetColumnWidth(xlWorksheet.Internals.ColumnsCollection[co].Width); isHidden = xlWorksheet.Internals.ColumnsCollection[co].IsHidden; collapsed = xlWorksheet.Internals.ColumnsCollection[co].Collapsed; outlineLevel = xlWorksheet.Internals.ColumnsCollection[co].OutlineLevel; @@ -1472,7 +1482,7 @@ else { styleId = sharedStyles[xlWorksheet.Style].StyleId; - columnWidth = xlWorksheet.ColumnWidth; + columnWidth = worksheetColumnWidth; } Column column = new Column() @@ -1493,12 +1503,12 @@ foreach (var col in columns.Elements().Where(c => c.Min > (UInt32)(maxInColumnsCollection)).OrderBy(c => c.Min.Value)) { col.Style = sharedStyles[xlWorksheet.Style].StyleId; - col.Width = xlWorksheet.ColumnWidth; + col.Width = worksheetColumnWidth; col.CustomWidth = true; if ((Int32)col.Max.Value > maxInColumnsCollection) maxInColumnsCollection = (Int32)col.Max.Value; } - + if (maxInColumnsCollection < XLWorksheet.MaxNumberOfColumns) { Column column = new Column() @@ -1506,7 +1516,7 @@ Min = (UInt32)(maxInColumnsCollection + 1), Max = (UInt32)(XLWorksheet.MaxNumberOfColumns), Style = sharedStyles[xlWorksheet.Style].StyleId, - Width = xlWorksheet.ColumnWidth, + Width = worksheetColumnWidth, CustomWidth = true }; columns.Append(column); @@ -1723,12 +1733,6 @@ #region PrintOptions PrintOptions printOptions = null; - if (xlWorksheet.Internals.CellsCollection.Count == 0) - { - worksheetPart.Worksheet.RemoveAllChildren(); - } - else - { if (worksheetPart.Worksheet.Elements().Count() == 0) { OpenXmlElement previousElement; @@ -1754,7 +1758,6 @@ printOptions.VerticalCentered = xlWorksheet.PageSetup.CenterVertically; printOptions.Headings = xlWorksheet.PageSetup.ShowRowAndColumnHeadings; printOptions.GridLines = xlWorksheet.PageSetup.ShowGridlines; - } #endregion #region PageMargins @@ -1835,15 +1838,17 @@ } else { + pageSetup.Scale = null; + if (xlWorksheet.PageSetup.PagesWide > 0) pageSetup.FitToWidth = (UInt32)xlWorksheet.PageSetup.PagesWide; else - pageSetup.FitToWidth = null; + pageSetup.FitToWidth = 0; if (xlWorksheet.PageSetup.PagesTall > 0) pageSetup.FitToHeight = (UInt32)xlWorksheet.PageSetup.PagesTall; else - pageSetup.FitToHeight = null; + pageSetup.FitToHeight = 0; } #endregion @@ -1874,8 +1879,8 @@ FirstFooter firstFooter = new FirstFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.FirstPage)); headerFooter.Append(firstFooter); - if (!headerFooter.Any(hf => hf.InnerText.Length > 0)) - worksheetPart.Worksheet.RemoveAllChildren(); + //if (!headerFooter.Any(hf => hf.InnerText.Length > 0)) + // worksheetPart.Worksheet.RemoveAllChildren(); #endregion #region RowBreaks @@ -1945,6 +1950,11 @@ #endregion } + private Double GetColumnWidth(Double columnWidth) + { + return columnWidth + 0.71; + } + private void UpdateColumn(Column column, Columns columns) { Column newColumn; @@ -1978,7 +1988,7 @@ if (column.OutlineLevel != null && column.OutlineLevel > 0) newColumn.OutlineLevel = (byte)column.OutlineLevel; else - newColumn.Hidden = null; + newColumn.OutlineLevel = null; if (existingColumn.Min + 1 > existingColumn.Max) { diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj index fbff07a..bdbf405 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -57,6 +57,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs index ac1406b..057f483 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs @@ -58,6 +58,7 @@ new NamedRanges().Create(@"C:\Excel Files\Created\NamedRanges.xlsx"); new CopyingRanges().Create(); new BlankCells().Create(@"C:\Excel Files\Created\BlankCells.xlsx"); + new TwoPages().Create(@"C:\Excel Files\Created\TwoPages.xlsx"); } } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Loading/LoadFiles.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Loading/LoadFiles.cs index b3a3efe..3404ed8 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Loading/LoadFiles.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Loading/LoadFiles.cs @@ -21,7 +21,7 @@ LoadAndSaveFile(forLoadingFolder + @"\" + fileName, forSavingFolder + @"\" + fileName); } - //LoadAndSaveFile(forLoadingFolder + @"\DataTypes.xlsx", forSavingFolder + @"\DataTypes.xlsx"); + //LoadAndSaveFile(forLoadingFolder + @"\HeaderFooters.xlsx", forSavingFolder + @"\HeaderFooters.xlsx"); } private static void LoadAndSaveFile(String input, String output) diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/MultipleSheets.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/MultipleSheets.cs index 2ebebf3..949490b 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/MultipleSheets.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/MultipleSheets.cs @@ -52,6 +52,23 @@ ws.SheetIndex = 0; wb.Worksheets.Worksheet("Inserted").SheetIndex = wb.Worksheets.Count(); wb.SaveAs(@"C:\Excel Files\Created\MultipleSheets_Saved.xlsx"); + + wb = new XLWorkbook(); + foreach (var wsNum in Enumerable.Range(0, 5)) + { + wb.Worksheets.Add("Original Pos. is " + wsNum.ToString()); + } + + // Move first worksheet to the last position + wb.Worksheets.Worksheet(0).SheetIndex = wb.Worksheets.Count(); + + // Delete worksheet on position 2 (in this case it's where original position = 3) + wb.Worksheets.Worksheet(2).Delete(); + + // Swap sheets in positions 0 and 1 + wb.Worksheets.Worksheet(1).SheetIndex = 0; + + wb.SaveAs(@"C:\Excel Files\Created\OrganizingSheets.xlsx"); } // Private diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/PageSetup/TwoPages.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/PageSetup/TwoPages.cs new file mode 100644 index 0000000..0fd6613 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/PageSetup/TwoPages.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; + +using System.Drawing; + +namespace ClosedXML_Examples.PageSetup +{ + public class TwoPages + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + foreach (var ro in Enumerable.Range(1, 100)) + { + foreach (var co in Enumerable.Range(1, 10)) + { + ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString(); + } + } + ws.PageSetup.PagesWide = 1; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs index 1253644..259c831 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs @@ -14,22 +14,20 @@ static void Main(string[] args) { var wb = new XLWorkbook(); - foreach (var wsNum in Enumerable.Range(0, 5)) + + var ws = wb.Worksheets.Add("Sheet1"); + foreach (var ro in Enumerable.Range(1, 100)) { - wb.Worksheets.Add("Original Pos. is " + wsNum.ToString()); + foreach (var co in Enumerable.Range(1, 10)) + { + ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString(); + } } + ws.PageSetup.PagesWide = 1; - // Move first worksheet to the last position - wb.Worksheets.Worksheet(0).SheetIndex = wb.Worksheets.Count(); - - // Delete worksheet on position 2 (in this case it's where original position = 3) - wb.Worksheets.Worksheet(2).Delete(); - - // Swap sheets in positions 0 and 1 - wb.Worksheets.Worksheet(1).SheetIndex = 0; - - wb.SaveAs(@"C:\Excel Files\ForTesting\OrganizingSheets.xlsx"); + wb.SaveAs(@"C:\Excel Files\ForTesting\Sandbox.xlsx"); } + static void xMain(string[] args) { List running = new List(); diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj new file mode 100644 index 0000000..3574cb0 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj @@ -0,0 +1,126 @@ + + + + Debug + x86 + + + + + {E005997D-B192-461F-AA3E-44007A33A3DF} + Exe + ClosedXML_Sandbox_VB.Module1 + ClosedXML_Sandbox_VB + ClosedXML_Sandbox_VB + 512 + Console + v4.0 + Client + SAK + SAK + SAK + SAK + + + x86 + true + full + true + true + bin\Debug\ + ClosedXML_Sandbox_VB.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + x86 + pdbonly + false + true + true + bin\Release\ + ClosedXML_Sandbox_VB.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + {BD5E6BFE-E837-4A35-BCA9-39667D873A20} + ClosedXML + + + + + \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj.vspscc b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj.vspscc new file mode 100644 index 0000000..feffdec --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/ClosedXML_Sandbox_VB.vbproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/Module1.vb b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/Module1.vb new file mode 100644 index 0000000..276fd85 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/Module1.vb @@ -0,0 +1,41 @@ +Imports ClosedXML.Excel +Imports System.IO +Module Module1 + Sub Main1() + Dim counter As Integer = 0 + + Dim workbook As New XLWorkbook + Dim worksheet = workbook.Worksheets.Add("Sample Sheet") + + 'Row1 + worksheet.Cell(1, 1).Value = "Some Random Text" + + 'Row2 + For counter = 0 To 6 Step 1 + worksheet.Cell(2, (counter * 2) + 2).Value = Now.AddDays(counter).ToString("yyyy-MM-dd") + Next + + 'Row3 + worksheet.Cell(3, 1).Value = "val1" + worksheet.Cell(3, 2).Value = "val2" + worksheet.Cell(3, 3).Value = "val3" + + 'worksheet.PageSetup.PrintAreas.Clear() + + workbook.SaveAs("C:\Excel Files\ForTesting\Issue_5957_Saved.xlsx") + End Sub + Sub Main() + Dim wb = New XLWorkbook() + Dim ws = wb.Worksheets.Add("Sheet1") + For Each ro In Enumerable.Range(1, 100) + For Each co In Enumerable.Range(1, 10) + ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString() + Next + Next + ws.PageSetup.PagesWide = 1 + + Dim ms As New MemoryStream + wb.SaveAs(ms) + End Sub + +End Module diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.Designer.vb b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.Designer.vb new file mode 100644 index 0000000..9478349 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.myapp b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.myapp new file mode 100644 index 0000000..23b627f --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 2 + true + diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/AssemblyInfo.vb b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..c8e6786 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.Designer.vb b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.Designer.vb new file mode 100644 index 0000000..f524b67 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ClosedXML_Sandbox_VB.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.resx b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.Designer.vb b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.Designer.vb new file mode 100644 index 0000000..5e637d7 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.ClosedXML_Sandbox_VB.My.MySettings + Get + Return Global.ClosedXML_Sandbox_VB.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.settings b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox_VB/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + +