使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是 OpenOffice

Pau*_*lor 2 java excel openoffice.org apache-poi

我正在使用 Jakarta Poi 从 Java 创建一个 .xlsx 文件,该文件可以在 Excel/Office 中打开。某些单元格表示多个值,并且最初是空分隔的,例如“fred/u000/tom”,当我在单元格中设置时,我将空字符替换为“\n”

这一切都适用于 OpenOffice,它提高了这些行的高度以容纳多行。但是我发现 OpenOffice 打开 xlsx 格式的文件比打开 xls 格式的时间要长得多,所以我投资了 Microsoft Excel,这会显示同一个文件,所有值都在一行中。

开发办公室

微软Excel

如果您开始编辑一个值,那么 Excel 会增加高度以容纳多个值,但为什么它在读取时不这样做。

MS 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);
}
Run Code Online (Sandbox Code Playgroud)

Axe*_*ter 5

这是不是从你的代码你在做什么错清楚,但在我的评论说, setWrapText 需要在被设置为true CellStyle为此应具有的换行单元格。

例子:

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();
 }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明