我使用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文件如下所示:
如上图所示,第一个名称'值仅显示部分。
但我想要的是:
即excel单元格中的内容可以包装,行高可以自动 适合细胞内容。
我该怎么做? 提前谢谢。
--------------更新了-----------------
解决方案是:
答案 0 :(得分:3)
我知道这篇文章已经很老了,但我偶然发现它是谷歌首次点击之一,并想分享我的解决方案。
我分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文件中编辑已包含loop-command的单元格注释,并将 autoRowHeight 命令添加为新行,例如:
jx:each(items="myitems", var="i", lastCell="B4")
jx:autoRowHeight(lastCell="B4")
感谢Leonid Vysochyn和Franz Frühwirth,他们引导我找到了这个解决方案。
答案 1 :(得分:1)
我在Excel 2016中遇到了相同的问题。我创建了一个xlsx模板,并使用了相同的解决方案 row.setHeight((short)-1),但是由于Excel 2016无效将dyDescent属性添加到模板中的行定义。我找不到一种方法来强制Excel不设置此属性。
dyDescent属性有副作用;它设置customHeight 即使将customHeight属性显式设置为true 为假。
我不确定您是否可以为xls-template实现此功能,但是... 这是我的解决方法:
@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);
}
}