使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是 OpenOffice
Posted
技术标签:
【中文标题】使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是 OpenOffice【英文标题】:With Apache Poi how do I create multivalue spreadsheet cells so displayed properly in MS Excel not just OpenOffice 【发布时间】:2017-07-11 11:08:03 【问题描述】:我正在使用 Jakarta Poi 从 Java 创建一个 .xlsx 文件,该文件可以在 Excel/Office 中打开。一些单元格代表多个值,最初是空分隔的,例如 'fred/u000/tom' 当我在单元格中设置时,我将空字符替换为 '\n'
这在 OpenOffice 上运行良好,它提高了这些行的高度以适应多行。但我发现 OpenOffice 以 xlsx 格式打开文件比 xls 格式花费的时间要长得多,所以我投资了 Microsoft Excel,它显示了同一个文件,所有值都在一行上。
如果您要编辑一个值,那么 Excel 会增加高度以容纳多个值,但为什么它在读取时不这样做。
由于不需要编辑电子表格,我可以使用其他东西来代替 '\n' 或强制 Excel 像 OpenOffice 一样显示文件的选项
代码提取
private void addFieldValue(Session session, Worksheet sheet, Row r, int spreadsheetIndex, SongFieldNameColumnWidth sfncw, SongChanges fieldChanges, Song song)
SongFieldName songFieldName = sfncw.getSongFieldName();
String value = "";
org.apache.poi.ss.usermodel.Cell c ;
c=r.createCell(spreadsheetIndex);
//Chnanges have been made to this field
if(fieldChanges!=null)
if (changeType == SongChangeType.ADD)
value = fieldChanges.getNewValue().replace('\u0000', '\n');
c.setCellValue(value);
c.setCellStyle(fieldAddedStyle);
else if (changeType == SongChangeType.EDIT)
value = fieldChanges.getNewValue().replace('\u0000', '\n');
c.setCellValue(value);
c.setCellStyle(fieldChangedStyle);
//addCellComment(r, c, sheet, fieldChanges.getOriginalValue());
else if (changeType == SongChangeType.DELETE)
c.setCellStyle(fieldDeletedStyle);
sfncw.setColumnWidthFromValue(value);
【问题讨论】:
没有看到您的生成代码,我们不太希望能够看到您的错误... @Gagravarr 我现在添加了一些代码,但实际上我已经解释了我是如何在问题中设置数据的。 如果您在 Excel 中输入要查看的值,然后从 Apache POI 中读取该值,POI 是如何将单元格值视为已完成的?也许\r
或\r\n
?
@Gagravaar 我尝试将代码更改为编写\r\n。现在 Excel 仍然显示为一行,但是当双击它时,它会在每条记录之间显示一个空行,而不是想要的。我认为数据是正确的,问题是Excel默认没有调整其显示以正确显示在多行上。
我看不出使用 '\n' 和 '\r' 有什么区别
【参考方案1】:
从您的代码中不清楚您做错了什么,但正如我在评论中所说,setWrapText 需要在 CellStyle 中设置为 true 用于应该有换行的单元格。
例子:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class CreateExcelCellWrapText
public static void main(String[] args) throws Exception
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
Row row = sheet.createRow(0);
CellStyle cellstyle = workbook.createCellStyle();
cellstyle.setWrapText(true);
Cell cell = row.createCell(0);
cell.setCellValue("String cell content\nhaving line wrap.");
cell.setCellStyle(cellstyle);
sheet.autoSizeColumn(0);
workbook.write(new FileOutputStream("CreateExcelCellWrapText.xlsx"));
workbook.close();
结果:
【讨论】:
如果您删除 sheet.autoSizeColumn(0); 您的示例是否有效 啊,对不起,我犯了愚蠢的错误,代码没有显示未更改的字段,未更改的字段没有单元格样式,当我运行测试时,所有字段都没有更改,因此您的修复不是应用。我可以确认它现在可以工作了,谢谢。以上是关于使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是 OpenOffice的主要内容,如果未能解决你的问题,请参考以下文章