NPOI C# 设置列以适合一页
NPOI C# set columns to fit on one page
我在我的 C# 应用程序中使用 NPOI 版本 2.5.3 并尝试设置缩放选项(在 1 页上调整所有列)。这些问题似乎很容易做到 and here.
问题:
所以,我的问题出现在使用下面的代码时。所做的只是配置;宽度和高度都适合一页。我认为这是因为 sheet.FitToPage = true.
private void SetPrintSettings(XSSFSheet sheet)
{
sheet.SetMargin(MarginType.BottomMargin, 0.5);
sheet.SetMargin(MarginType.TopMargin, 0.5);
sheet.SetMargin(MarginType.LeftMargin, 0.45);
sheet.SetMargin(MarginType.RightMargin, 0.45);
sheet.SetMargin(MarginType.HeaderMargin, 0.3);
sheet.SetMargin(MarginType.FooterMargin, 0.3);
sheet.Autobreaks = true; //auto breaks
sheet.FitToPage = true; //THIS SETS IT TO ALL FIT ON ONE PAGE
var PrintSetup = sheet.PrintSetup;
PrintSetup.FitWidth = 1; //fit width onto 1 page
PrintSetup.FitHeight = 0; //don't care about height
PrintSetup.Landscape = true;
PrintSetup.PaperSize = 3; //paper size 11x17
}
执行上面的代码时,我在 Excel 中得到以下输出。
所以在那之后不起作用,我尝试将其设置为 false,如下所示。
private void SetPrintSettings(XSSFSheet sheet)
{
sheet.SetMargin(MarginType.BottomMargin, 0.5);
sheet.SetMargin(MarginType.TopMargin, 0.5);
sheet.SetMargin(MarginType.LeftMargin, 0.45);
sheet.SetMargin(MarginType.RightMargin, 0.45);
sheet.SetMargin(MarginType.HeaderMargin, 0.3);
sheet.SetMargin(MarginType.FooterMargin, 0.3);
sheet.Autobreaks = true; //auto breaks
sheet.FitToPage = false;
var PrintSetup = sheet.PrintSetup;
PrintSetup.FitWidth = 1; //fit width onto 1 page
PrintSetup.FitHeight = 0; //don't care about height
PrintSetup.Landscape = true;
PrintSetup.PaperSize = 3; //paper size 11x17
}
当更改配置时,它会呈现“无缩放”,如下所示。
无论我怎么尝试,我似乎都无法让它工作。我尝试了各种设置,但似乎没有任何效果。我开始认为这是我使用的版本的错误。我找到的几乎所有示例都是针对 Java POI 的,所以我不确定这是否只是一个方法问题。
期望输出:
下面是我正在尝试做的事情。只需将缩放选项设置为将列适合 1 页。如果有人能帮助我或指出正确的方向,那就太好了。
1) You could be missing autoSizeColumn
, if I understood you correctly. Please configure/setup to autosize
the cols to fit you need to use youExcelSheet.AutoSizeColumn()
and, that in 2) combination with the autofit to page/sheet FitToPage
should make it work for you.
来自 Apache Github 的源代码,因为列和页面大小的计算调用顺序 可能 在 autoSizeCol
和 [=17= 之间很重要] 页面你可以尝试两种组合
来自 apache 参考。可以从 Apache here,
自动调整你的 cols ref
// create some cells
for (int r=0; r < 10; r++) {
Row row = sheet.createRow(r);
for (int c; c < 10; c++) {
Cell cell = row.createCell(c);
cell.setCellValue("Cell " + c.getAddress().formatAsString());
}
}
// 1 ** AUTO-Size the columns individually like below.
// 2 Or get/fit ALL, then loop through the cols, divide the sheet by number of cols
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
和 SO here
中的旧示例
HSSFWorkbook spreadsheet = new HSSFWorkbook();
DataSet results = GetSalesDataFromDatabase();
//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1");
foreach (DataColumn column in results.Tables[0].Columns)
{
int rowIndex = 0;
foreach (DataRow row in results.Tables[0].Rows)
{
HSSFRow dataRow = sheet1.CreateRow(rowIndex);
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
rowIndex++;
}
sheet1.AutoSizeColumn(column.Ordinal);
}
//Write the stream data of workbook to the file 'test.xls' in the temporary directory
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls") , FileMode.Create);
spreadsheet.Write(file);
file.Close();
看起来这是 NPOI 中的一个错误。
为了实现设置,您需要 sheet XML 中的 PageSetup
元素将 fitToHeight
属性设置为 0。例如:
<pageSetup orientation="landscape" fitToHeight="0"/>
不幸的是,如果我正确阅读了 NPOI 代码,NPOI 似乎没有输出该属性,因为它认为它是一个空白值。
当您调用 PrintSetup.FitHeight = 0;
时,它会在 Sheet.cs
中设置 fitToHeight
属性。写入文件时,在Sheet.cs中有如下内容:
XmlHelper.WriteAttribute(sw, "fitToHeight", this.fitToHeight, 1);
WriteAttribute
代码如下所示:
public static void WriteAttribute(StreamWriter sw, string attributeName, uint value, uint defaultValue, bool writeIfBlank = false)
{
if(value != defaultValue)
WriteAttribute(sw, attributeName, (int)value, writeIfBlank);
else if(writeIfBlank)
WriteAttribute(sw, attributeName, (int)value, writeIfBlank);
}
value
(0) 在我们的例子中不等于 defaultValue
(1) 所以我们输入第一个 if
。这调用了 WriteAttribute
的另一个重载,如下所示:
public static void WriteAttribute(StreamWriter sw, string attributeName, int value, bool writeIfBlank)
{
if (value == 0 && !writeIfBlank)
return;
WriteAttribute(sw, attributeName, value.ToString(CultureInfo.InvariantCulture));
}
value
是 等于 0
而 writeIfBlank
是假的 所以,同样,第一个 if
是真的并且因此 return;
被命中并且没有值被写出。
我在我的 C# 应用程序中使用 NPOI 版本 2.5.3 并尝试设置缩放选项(在 1 页上调整所有列)。这些问题似乎很容易做到
问题:
所以,我的问题出现在使用下面的代码时。所做的只是配置;宽度和高度都适合一页。我认为这是因为 sheet.FitToPage = true.
private void SetPrintSettings(XSSFSheet sheet)
{
sheet.SetMargin(MarginType.BottomMargin, 0.5);
sheet.SetMargin(MarginType.TopMargin, 0.5);
sheet.SetMargin(MarginType.LeftMargin, 0.45);
sheet.SetMargin(MarginType.RightMargin, 0.45);
sheet.SetMargin(MarginType.HeaderMargin, 0.3);
sheet.SetMargin(MarginType.FooterMargin, 0.3);
sheet.Autobreaks = true; //auto breaks
sheet.FitToPage = true; //THIS SETS IT TO ALL FIT ON ONE PAGE
var PrintSetup = sheet.PrintSetup;
PrintSetup.FitWidth = 1; //fit width onto 1 page
PrintSetup.FitHeight = 0; //don't care about height
PrintSetup.Landscape = true;
PrintSetup.PaperSize = 3; //paper size 11x17
}
执行上面的代码时,我在 Excel 中得到以下输出。
所以在那之后不起作用,我尝试将其设置为 false,如下所示。
private void SetPrintSettings(XSSFSheet sheet)
{
sheet.SetMargin(MarginType.BottomMargin, 0.5);
sheet.SetMargin(MarginType.TopMargin, 0.5);
sheet.SetMargin(MarginType.LeftMargin, 0.45);
sheet.SetMargin(MarginType.RightMargin, 0.45);
sheet.SetMargin(MarginType.HeaderMargin, 0.3);
sheet.SetMargin(MarginType.FooterMargin, 0.3);
sheet.Autobreaks = true; //auto breaks
sheet.FitToPage = false;
var PrintSetup = sheet.PrintSetup;
PrintSetup.FitWidth = 1; //fit width onto 1 page
PrintSetup.FitHeight = 0; //don't care about height
PrintSetup.Landscape = true;
PrintSetup.PaperSize = 3; //paper size 11x17
}
当更改配置时,它会呈现“无缩放”,如下所示。
无论我怎么尝试,我似乎都无法让它工作。我尝试了各种设置,但似乎没有任何效果。我开始认为这是我使用的版本的错误。我找到的几乎所有示例都是针对 Java POI 的,所以我不确定这是否只是一个方法问题。
期望输出:
下面是我正在尝试做的事情。只需将缩放选项设置为将列适合 1 页。如果有人能帮助我或指出正确的方向,那就太好了。
1) You could be missing
autoSizeColumn
, if I understood you correctly. Please configure/setup toautosize
the cols to fit you need to useyouExcelSheet.AutoSizeColumn()
and, that in 2) combination with the autofit to page/sheetFitToPage
should make it work for you.
来自 Apache Github 的源代码,因为列和页面大小的计算调用顺序 可能 在 autoSizeCol
和 [=17= 之间很重要] 页面你可以尝试两种组合
来自 apache 参考。可以从 Apache here,
自动调整你的 cols ref// create some cells
for (int r=0; r < 10; r++) {
Row row = sheet.createRow(r);
for (int c; c < 10; c++) {
Cell cell = row.createCell(c);
cell.setCellValue("Cell " + c.getAddress().formatAsString());
}
}
// 1 ** AUTO-Size the columns individually like below.
// 2 Or get/fit ALL, then loop through the cols, divide the sheet by number of cols
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
和 SO here
中的旧示例HSSFWorkbook spreadsheet = new HSSFWorkbook();
DataSet results = GetSalesDataFromDatabase();
//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1");
foreach (DataColumn column in results.Tables[0].Columns)
{
int rowIndex = 0;
foreach (DataRow row in results.Tables[0].Rows)
{
HSSFRow dataRow = sheet1.CreateRow(rowIndex);
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
rowIndex++;
}
sheet1.AutoSizeColumn(column.Ordinal);
}
//Write the stream data of workbook to the file 'test.xls' in the temporary directory
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls") , FileMode.Create);
spreadsheet.Write(file);
file.Close();
看起来这是 NPOI 中的一个错误。
为了实现设置,您需要 sheet XML 中的 PageSetup
元素将 fitToHeight
属性设置为 0。例如:
<pageSetup orientation="landscape" fitToHeight="0"/>
不幸的是,如果我正确阅读了 NPOI 代码,NPOI 似乎没有输出该属性,因为它认为它是一个空白值。
当您调用 PrintSetup.FitHeight = 0;
时,它会在 Sheet.cs
中设置 fitToHeight
属性。写入文件时,在Sheet.cs中有如下内容:
XmlHelper.WriteAttribute(sw, "fitToHeight", this.fitToHeight, 1);
WriteAttribute
代码如下所示:
public static void WriteAttribute(StreamWriter sw, string attributeName, uint value, uint defaultValue, bool writeIfBlank = false)
{
if(value != defaultValue)
WriteAttribute(sw, attributeName, (int)value, writeIfBlank);
else if(writeIfBlank)
WriteAttribute(sw, attributeName, (int)value, writeIfBlank);
}
value
(0) 在我们的例子中不等于 defaultValue
(1) 所以我们输入第一个 if
。这调用了 WriteAttribute
的另一个重载,如下所示:
public static void WriteAttribute(StreamWriter sw, string attributeName, int value, bool writeIfBlank)
{
if (value == 0 && !writeIfBlank)
return;
WriteAttribute(sw, attributeName, value.ToString(CultureInfo.InvariantCulture));
}
value
是 等于 0
而 writeIfBlank
是假的 所以,同样,第一个 if
是真的并且因此 return;
被命中并且没有值被写出。