java - 不同大小的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());
不知道是否有机会设置字体名称。
解决方案
问题CDATA
来自.xmlbeans
Xmlbeans
XmlOptions
在阅读和保存时使用XML
。有以下设置:XmlOptions.setSaveCDataLengthThreshold和XmlOptions.setSaveCDataEntityCountThreshold
. setSaveCDataLengthThreshold
设置包含实体的文本内容的最小长度,超出该长度CDATA
。setSaveCDataEntityCountThreshold
设置文本中的实体计数,超出该计数CDATA
。默认setSaveCDataEntityCountThreshold
为 5。因此,如果文本内容包含超过 5 个实体,那么它将被包裹到CDATA
.
因此,CDATA
如果页眉或页脚文本包含超过 5 个&
(其中XML
必须是5 个),则会出现问题&
。然后对该文本xmlbeans
使用块。CDATA
为避免这种情况,唯一的方法是更改 POIXMLTypeLoader.DEFAULT_XML_OPTIONS。有适当的设置setSaveCDataLengthThreshold
和setSaveCDataEntityCountThreshold
必须放置。由于Excel
它本身从不使用CDATA
块,apache poi
也不应该。
但是您应该更准确地判断哪个版本的这些块Excel
有问题。CDATA
对我来说,下面的完整示例会Excel 2016
在Excel 365
(all in Windows
) 中产生想要的结果,即使CDATA
在XML
.
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 个字符。
推荐阅读
- rust - 在 Tokio 中向非线程安全的单例对象分派请求
- python - 使用加法器电路将两个 4 位二进制数相加
- flask - 如何将计数器连接到 Jinja2 表达式?
- quickfixj - 重置后是否需要重新订阅市场数据?
- node.js - axios 上传到 node.js API 导致 aws s3 中的文件变得不可读
- sql - 在databricks中使用sql创建最大日期函数
- javascript - 如何让 JavaScript 函数应用的类一直运行到窗口关闭(网页设计)
- python - 在有和没有包依赖的情况下进行测试
- javascript - 带有 Javascript 的 html 中的表格过滤器不起作用
- django - 从 Redis 丢失计划的 Celery 任务