JXLS 根据内容自动适配行高
JXLS auto fit row height according to the content
我正在使用 JXLS 2.3.0 和 apache poi 实现。
我使用以下代码创建 excel :
try{
InputStream is = ObjectCollectionDemo.class.getResourceAsStream("/template.xls")
OutputStream os = new FileOutputStream("target/output.xls")
Context context = new Context();
context.putVar("employees", employees);
JxlsHelper.getInstance().processTemplate(is, os, context);
}
我生成的 excel 文件如下所示:
如上图所示,第一个'Name'值只显示部分。
但我想要的是:
也就是excel单元格的内容可以换行,行高可以自动
适合单元格内容。
我该怎么做?
提前致谢。
------------更新了----------------
解决方法是:
- 照@Andy 说的做了
- 在模板文件中将相应的单元格格式化为
wrap text
- (optional)经过第一步和第二步,可以显示99%的单元格内容信息,但还是漏掉了一些。然后我打开模板文件,发现它看起来像下一个:
我们可以发现${a.name}
的}
换行了,
将其更改为:
即make ${a.name}
在一行,则所有内容都可以显示。
我知道这个 post 已经很老了,但我偶然发现它是第一个 Google 命中,并想分享我的解决方案。
我分 3 步实现了 MS Excel 2010 的自动行高功能。
创建命令:
public class AutoRowHeightCommand extends AbstractCommand {
// ... left out boilerplate
@Override
public Size applyAt(CellRef cellRef, Context context) {
Size size = this.area.applyAt(cellRef, context);
PoiTransformer transformer = (PoiTransformer) area.getTransformer();
Row row = transformer.getWorkbook().getSheet(cellRef.getSheetName()).getRow(cellRef.getRow());
row.setHeight((short) -1);
return size;
}
}
配置要使用的命令
// static method call:
XlsCommentAreaBuilder.addCommandMapping("autoRowHeight", AutoRowHeightCommand.class);
JxlsHelper.getInstance().processTemplate(is, os, context);
利用命令
在 template.xlsx 文件中编辑已经包含循环命令的单元格注释,并添加 autoRowHeight 命令作为新行,例如:
jx:each(items="myitems", var="i", lastCell="B4")
jx:autoRowHeight(lastCell="B4")
感谢 Leonid Vysochyn and Franz Frühwirth,是他引导我找到这个解决方案。
我与 Excel 2016 有同样的问题。我创建了一个 xlsx 模板并使用了相同的解决方案 row.setHeight((short) -1) ,但它不起作用,因为 Excel 2016 将 dyDescent 属性添加到模板中的行定义。我找不到如何强制 Excel 不设置此属性的方法。
The dyDescent attribute has a side effect; it sets the customHeight
attribute to true even if the customHeight attribute is explicitly set
to false.
我不确定您是否可以为 xls 模板实现它,但是...
这是我的解决方法:
@Override
public Size applyAt(CellRef cellRef, Context context) {
// code from @Andy example
Row row = .....
removeDyDescentAttr(row);
return size;
}
private void removeDyDescentAttr(Row row) {
XSSFRow xssfRow = (XSSFRow) row;
CTRowImpl ctRow = (CTRowImpl) xssfRow.getCTRow();
QName dyDescent = new QName("http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
if (ctRow.get_store().find_attribute_user(dyDescent) != null) {
ctRow.get_store().remove_attribute(dyDescent);
}
}
我正在使用 JXLS 2.3.0 和 apache poi 实现。
我使用以下代码创建 excel :
try{
InputStream is = ObjectCollectionDemo.class.getResourceAsStream("/template.xls")
OutputStream os = new FileOutputStream("target/output.xls")
Context context = new Context();
context.putVar("employees", employees);
JxlsHelper.getInstance().processTemplate(is, os, context);
}
我生成的 excel 文件如下所示:
如上图所示,第一个'Name'值只显示部分。
但我想要的是:
也就是excel单元格的内容可以换行,行高可以自动 适合单元格内容。
我该怎么做? 提前致谢。
------------更新了----------------
解决方法是:
- 照@Andy 说的做了
- 在模板文件中将相应的单元格格式化为
wrap text
- (optional)经过第一步和第二步,可以显示99%的单元格内容信息,但还是漏掉了一些。然后我打开模板文件,发现它看起来像下一个:
我们可以发现${a.name}
的}
换行了,
将其更改为:
即make ${a.name}
在一行,则所有内容都可以显示。
我知道这个 post 已经很老了,但我偶然发现它是第一个 Google 命中,并想分享我的解决方案。
我分 3 步实现了 MS Excel 2010 的自动行高功能。
创建命令:
public class AutoRowHeightCommand extends AbstractCommand {
// ... left out boilerplate
@Override
public Size applyAt(CellRef cellRef, Context context) {
Size size = this.area.applyAt(cellRef, context);
PoiTransformer transformer = (PoiTransformer) area.getTransformer();
Row row = transformer.getWorkbook().getSheet(cellRef.getSheetName()).getRow(cellRef.getRow());
row.setHeight((short) -1);
return size;
}
}
配置要使用的命令
// static method call:
XlsCommentAreaBuilder.addCommandMapping("autoRowHeight", AutoRowHeightCommand.class);
JxlsHelper.getInstance().processTemplate(is, os, context);
利用命令
在 template.xlsx 文件中编辑已经包含循环命令的单元格注释,并添加 autoRowHeight 命令作为新行,例如:
jx:each(items="myitems", var="i", lastCell="B4")
jx:autoRowHeight(lastCell="B4")
感谢 Leonid Vysochyn and Franz Frühwirth,是他引导我找到这个解决方案。
我与 Excel 2016 有同样的问题。我创建了一个 xlsx 模板并使用了相同的解决方案 row.setHeight((short) -1) ,但它不起作用,因为 Excel 2016 将 dyDescent 属性添加到模板中的行定义。我找不到如何强制 Excel 不设置此属性的方法。
The dyDescent attribute has a side effect; it sets the customHeight attribute to true even if the customHeight attribute is explicitly set to false.
我不确定您是否可以为 xls 模板实现它,但是... 这是我的解决方法:
@Override
public Size applyAt(CellRef cellRef, Context context) {
// code from @Andy example
Row row = .....
removeDyDescentAttr(row);
return size;
}
private void removeDyDescentAttr(Row row) {
XSSFRow xssfRow = (XSSFRow) row;
CTRowImpl ctRow = (CTRowImpl) xssfRow.getCTRow();
QName dyDescent = new QName("http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
if (ctRow.get_store().find_attribute_user(dyDescent) != null) {
ctRow.get_store().remove_attribute(dyDescent);
}
}