首页 > 解决方案 > 不同大小的Excel页脚

问题描述

我有以下代码:

final Footer footer = getSheet().getFooter();
final StringBuilder strFooterText = new StringBuilder();
strFooterText.append(DETAILS_FOOTER.get(0));
strFooterText.append("\n");

// another line
strFooterText.append(DETAILS_FOOTER.get(1));
strFooterText.append(getDetails());

final String fnt = HeaderFooter.font(DEFAULT_FONT_NAME, "regular")
  + HeaderFooter.fontSize(DEFAULT_DETAILS_FOOTER_FONT_HEIGHT);
footer.setLeft(fnt + strFooterText.toString());

当我XLSX用 LibreOffice 打开结果时,这种代码可以正常工作。当我用 Excel 2016 打开它时,使用的fnt将不起作用。使用修复选项,这已经消失了。

有没有办法改变页脚的字体大小以使其使用Excel2016(以及以后)?


更新

在回复之后,我发现我在左边footer有一个右边footer的数据:

footer.setRight("Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages());

这导致CDATA.

从更新中我发现这font-name是麻烦制造者。没有字体名称它可以工作。所以下面的代码有效:

final Footer footer = getSheet().getFooter();
final StringBuilder strFooterText = new StringBuilder();
strFooterText.append(DETAILS_FOOTER.get(0));
strFooterText.append("\n");

// another line
strFooterText.append(DETAILS_FOOTER.get(1));
strFooterText.append(getDetails());

//final String fnt = HeaderFooter.font(DEFAULT_FONT_NAME, "regular")
//  + HeaderFooter.fontSize(DEFAULT_DETAILS_FOOTER_FONT_HEIGHT);
footer.setLeft("&8" + strFooterText.toString());
footer.setRight("Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages());

不知道是否有机会设置字体名称。

标签: javaapache-poi

解决方案


问题CDATA来自.xmlbeans

XmlbeansXmlOptions在阅读和保存时使用XML。有以下设置:XmlOptions.setSaveCDataLengthThresholdXmlOptions.setSaveCDataEntityCountThreshold. setSaveCDataLengthThreshold设置包含实体的文本内容的最小长度,超出该长度CDATAsetSaveCDataEntityCountThreshold设置文本中的实体计数,超出该计数CDATA。默认setSaveCDataEntityCountThreshold为 5。因此,如果文本内容包含超过 5 个实体,那么它将被包裹到CDATA.

因此,CDATA如果页眉或页脚文本包含超过 5 个&(其中XML必须是5 个),则会出现问题&。然后对该文本xmlbeans使用块。CDATA

为避免这种情况,唯一的方法是更改​​ POIXMLTypeLoader.DEFAULT_XML_OPTIONS。有适当的设置setSaveCDataLengthThresholdsetSaveCDataEntityCountThreshold必须放置。由于Excel它本身从不使用CDATA块,apache poi也不应该。

但是您应该更准确地判断哪个版本的这些块Excel有问题。CDATA对我来说,下面的完整示例会Excel 2016Excel 365(all in Windows) 中产生想要的结果,即使CDATAXML.

import java.io.FileOutputStream ;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.usermodel.HeaderFooter;

public class CreateExcelFooterText {

 static final String DEFAULT_FONT_NAME = "Arial";
 static final short DEFAULT_DETAILS_FOOTER_FONT_HEIGHT = 8;

 public static void main(String[] args) throws Exception {

  StringBuilder strFooterText = new StringBuilder();
  strFooterText.append("The footer text");
  strFooterText.append("\n");
  strFooterText.append("containing ");
  strFooterText.append("multiple lines");

  String fnt = HeaderFooter.font(DEFAULT_FONT_NAME, "regular")
  + HeaderFooter.fontSize(DEFAULT_DETAILS_FOOTER_FONT_HEIGHT);

  Workbook workbook = new XSSFWorkbook(); String filePath = "./CreateExcelFooterText.xlsx";
  //Workbook workbook = new HSSFWorkbook(); String filePath = "./CreateExcelFooterText.xls";

  Sheet sheet = workbook.createSheet();
  sheet.createRow(0).createCell(0).setCellValue("A1");

  Footer footer = sheet.getFooter();
  footer.setLeft(fnt + strFooterText.toString());  
  footer.setCenter("&\"Times New Roman,bold\"&24&K00FF00Center footer\n&\"Arial,regular\"&8&K000000further Text");
  footer.setRight("Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages());

  FileOutputStream out = new FileOutputStream(filePath);
  workbook.write(out);
  out.close();
  workbook.close();

 }
}

因此,如果您运行这个完整的示例,那么哪个确切版本Excel将无法正确显示该*.xlsx文件?


所以问题不在于CDATA使用,而在于达到了Excel限制。请参阅:Excel 规范和限制

页眉或页脚中的字符:255

因此,页眉和/或页脚的总和不得超过 255 个字符。


推荐阅读