C#新手在这里!
我需要创建一个小型控制台应用程序来将CSV文件转换为XLSX文件.
我有我的所有样式和数据,但我想在某些列上设置不同的(默认)宽度.经过一天的搜索和阅读后,我仍然无法弄清楚如何让它发挥作用.
作为一个例子,我想
>将列A和C设置为宽度30
>将列D设置为宽度20
using System; using System.Linq; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; using Microsoft.VisualBasic.FileIO; namespace xml_test { class Program { static void Main(string[] args) { string xlsx_path = @"c:\test\test.xlsx"; string CSV_Path = @"c:\test\test.csv"; // Skal nok ha en try her i tilfellet et dolument er åpent eller noe slikt... using (var spreadsheet = SpreadsheetDocument.Create(xlsx_path,SpreadsheetDocumentType.Workbook)) { spreadsheet.AddWorkbookPart(); spreadsheet.WorkbookPart.Workbook = new Workbook(); var wsPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>(); wsPart.Worksheet = new Worksheet(); SheetFormatProperties sheetFormatProperties = new SheetFormatProperties() { DefaultColumnWidth = 15,DefaultRowHeight = 15D }; wsPart.Worksheet.Append(sheetFormatProperties); var stylesPart = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>(); stylesPart.Stylesheet = new Stylesheet(); // Font list // Create a bold font stylesPart.Stylesheet.Fonts = new Fonts(); Font bold_font = new Font(); // Bold font Bold bold = new Bold(); bold_font.Append(bold); // Add fonts to list stylesPart.Stylesheet.Fonts.AppendChild(new Font()); stylesPart.Stylesheet.Fonts.AppendChild(bold_font); // Bold gets fontid = 1 stylesPart.Stylesheet.Fonts.Count = 2; // Create fills list stylesPart.Stylesheet.Fills = new Fills(); // create red fill for Failed tests var formatRed = new PatternFill() { PatternType = PatternValues.Solid }; formatRed.ForegroundColor = new ForegroundColor { Rgb = HexBinaryValue.FromString("FF6600") }; // red fill formatRed.BackgroundColor = new BackgroundColor { Indexed = 64 }; // Create green fill for passed tests var formatGreen = new PatternFill() { PatternType = PatternValues.Solid }; formatGreen.ForegroundColor = new ForegroundColor { Rgb = HexBinaryValue.FromString("99CC00") }; // green fill formatGreen.BackgroundColor = new BackgroundColor { Indexed = 64 }; // Create blue fill var formatBlue = new PatternFill() { PatternType = PatternValues.Solid }; formatBlue.ForegroundColor = new ForegroundColor { Rgb = HexBinaryValue.FromString("81DAF5") }; formatBlue.BackgroundColor = new BackgroundColor { Indexed = 64 }; // Create Light Green fill var formatLightGreen = new PatternFill() { PatternType = PatternValues.Solid }; formatLightGreen.ForegroundColor = new ForegroundColor { Rgb = HexBinaryValue.FromString("F1F8E0") }; formatLightGreen.BackgroundColor = new BackgroundColor { Indexed = 64 }; // Append fills to list stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = new PatternFill { PatternType = PatternValues.None } }); // required,reserved by Excel stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = new PatternFill { PatternType = PatternValues.Gray125 } }); // required,reserved by Excel stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = formatRed }); // Red gets fillid = 2 stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = formatGreen }); // Green gets fillid = 3 stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = formatBlue }); // Blue gets fillid = 4,old format1 stylesPart.Stylesheet.Fills.AppendChild(new Fill { PatternFill = formatLightGreen }); // LightGreen gets fillid = 5,old format2 stylesPart.Stylesheet.Fills.Count = 6; // Create border list stylesPart.Stylesheet.Borders = new Borders(); // Create thin borders for passed/Failed tests and default cells LeftBorder leftThin = new LeftBorder() { Style = BorderStyleValues.Thin }; RightBorder rightThin = new RightBorder() { Style = BorderStyleValues.Thin }; TopBorder topThin = new TopBorder() { Style = BorderStyleValues.Thin }; BottomBorder bottomThin = new BottomBorder() { Style = BorderStyleValues.Thin }; Border borderThin = new Border(); borderThin.Append(leftThin); borderThin.Append(rightThin); borderThin.Append(topThin); borderThin.Append(bottomThin); // Create thick borders for headings LeftBorder leftThick = new LeftBorder() { Style = BorderStyleValues.Thick }; RightBorder rightThick = new RightBorder() { Style = BorderStyleValues.Thick }; TopBorder topThick = new TopBorder() { Style = BorderStyleValues.Thick }; BottomBorder bottomThick = new BottomBorder() { Style = BorderStyleValues.Thick }; Border borderThick = new Border(); borderThick.Append(leftThick); borderThick.Append(rightThick); borderThick.Append(topThick); borderThick.Append(bottomThick); // Add borders to list stylesPart.Stylesheet.Borders.AppendChild(new Border()); stylesPart.Stylesheet.Borders.AppendChild(borderThin); stylesPart.Stylesheet.Borders.AppendChild(borderThick); stylesPart.Stylesheet.Borders.Count = 3; // Create blank cell format list stylesPart.Stylesheet.CellStyleFormats = new CellStyleFormats(); stylesPart.Stylesheet.CellStyleFormats.Count = 1; stylesPart.Stylesheet.CellStyleFormats.AppendChild(new CellFormat()); // Create cell format list stylesPart.Stylesheet.CellFormats = new CellFormats(); // empty one for index 0,seems to be required stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat()); // cell format for Failed tests,Styleindex = 1,Red fill and bold text stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat { FormatId = 0,FontId = 1,BorderId = 2,FillId = 2,ApplyFill = true }).AppendChild(new Alignment { Horizontal = HorizontalAlignmentValues.Center }); // cell format for passed tests,Styleindex = 2,Green fill and bold text stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat { FormatId = 0,FillId = 3,ApplyFill = true }).AppendChild(new Alignment { Horizontal = HorizontalAlignmentValues.Center }); // cell format for blue background,Styleindex = 3,blue fill and bold text stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat { FormatId = 0,BorderId = 1,FillId = 4,ApplyFill = true }).AppendChild(new Alignment { Horizontal = HorizontalAlignmentValues.Center }); // cell format for light green background,Styleindex = 4,light green fill and bold text stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat { FormatId = 0,FillId = 5,ApplyFill = true }).AppendChild(new Alignment { Horizontal = HorizontalAlignmentValues.Center }); // default cell style,thin border and rest default stylesPart.Stylesheet.CellFormats.AppendChild(new CellFormat { FormatId = 0,FontId = 0,FillId = 0,ApplyFill = true }).AppendChild(new Alignment { Horizontal = HorizontalAlignmentValues.Center }); stylesPart.Stylesheet.CellFormats.Count = 6; stylesPart.Stylesheet.Save(); var sheetData = wsPart.Worksheet.AppendChild(new SheetData()); TextFieldParser parser = new TextFieldParser(CSV_Path); parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(";"); while (!parser.EndOfData) { string line = parser.ReadLine(); string[] elements = line.Split(';'); var row = sheetData.AppendChild(new Row()); if (parser.LineNumber == 2) { foreach (string element in elements) { row.AppendChild(new Cell() { CellValue = new CellValue(element),DataType = CellValues.String,StyleIndex = 3 }); } } if (parser.LineNumber == 3) { foreach (string element in elements) { if (elements.First() == element && element == "Pass") { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 2 }); } else if (elements.First() == element && element == "Fail") { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 1 }); } else { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 5 }); } } } if (parser.LineNumber == 4) { foreach (string element in elements) { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 4 }); } } if (parser.LineNumber > 4 || parser.LineNumber == -1) { int i = 0; foreach (string element in elements) { if (i == 1 && element == "Pass") { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 2 }); } else if (i == 1 && element == "Fail") { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 1 }); } else { row.AppendChild(new Cell() { CellValue = new CellValue(element),StyleIndex = 5 }); } i++; } } } var sheets = spreadsheet.WorkbookPart.Workbook.AppendChild(new Sheets()); sheets.AppendChild(new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(wsPart),SheetId = 1,Name = "sheet1" }); spreadsheet.WorkbookPart.Workbook.Save(); } } } }
解决方法
要设置列宽,需要创建一个
Columns
元素,该元素可以包含一个或多个
Column
子元素.
每个Column类都可以应用于Excel文件中的多个列. Min和Max属性定义Column适用的第一列和最后一列(包括).
在您的示例中,您需要定义两个Column实例,一个Min = 1,Max = 2,另一个Min和Max都设置为4(Min和Max是数字,A = 1,B = 2等).
需要将Column集合添加到SheetData元素之前的Worksheet中.
在stylesPart.Stylesheet.Save()之后添加以下代码;但在var sheetData = wsPart.Worksheet.AppendChild(new SheetData())之前;应该达到你的目标:
Columns columns = new Columns(); columns.Append(new Column() { Min = 1,Max = 3,Width = 20,CustomWidth = true }); columns.Append(new Column() { Min = 4,Max = 4,Width = 30,CustomWidth = true }); wsPart.Worksheet.Append(columns);
注意1:Column类未涵盖的任何列都将具有默认宽度.