使用 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的主要内容,如果未能解决你的问题,请参考以下文章

雷林鹏分享:Apache POI电子表格/Spreadsheet

Apache POI锁定标题行

编写大型 Excel 电子表格

使用Apache POI - Java时,某些单元格不可见

使用Apache POI从excel文件中获取图像及其位置

Apache POI - 使用 XSSFWorkbok + servlet 响应