在写入excel文件时,它会丢失一些数据。 Java的

时间:2016-04-03 08:01:13

标签: java excel

我正在创建XLSX文件并向单元格添加一些值,它写道一切正常,但当我读回文件或只是打开文件。我没有看到那里的所有数据。

File myfile = new File("hello.xlsx");
Workbook workBook = new XSSFWorkbook();
Sheet sheet = workBook.createSheet("sheet");
String[] tokens= {"A1", "B5", "C7", "J1", "K15", "Z20"};

    for (String tok: tokens) {
        CellReference ref = new CellReference(tok);
        Row row = sheet.createRow(ref.getRow());
        Cell cell = row.createCell((short) ref.getCol());
        cell.setCellValue("blabla");
        System.out.println(ref);
    }

workBook.write(new FileOutputStream(myfile));
workBook.close();

System.out.println();

FileInputStream fileInputStream = new FileInputStream(myfile);
Workbook workBook2 = new XSSFWorkbook(fileInputStream);
Sheet worksheet = workBook2.getSheet("sheet");

    for(String tok: tokens) {
        CellReference ref= new CellReference(tok);
        Row row = worksheet.getRow(ref.getRow());
        Cell cell = row.getCell(ref.getCol());
        if(cell != null){
           System.out.println(ref);
        }
    }

但是当我读回来的时候,我只得到了一些。为什么呢?

org.apache.poi.ss.util.CellReference [A1]
org.apache.poi.ss.util.CellReference [B5]
org.apache.poi.ss.util.CellReference [C7]
org.apache.poi.ss.util.CellReference [J1]
org.apache.poi.ss.util.CellReference [K15]
org.apache.poi.ss.util.CellReference [Z20]

org.apache.poi.ss.util.CellReference [B5]
org.apache.poi.ss.util.CellReference [C7]
org.apache.poi.ss.util.CellReference [J1]
org.apache.poi.ss.util.CellReference [K15]
org.apache.poi.ss.util.CellReference [Z20]

2 个答案:

答案 0 :(得分:1)

您正在创建Row 1(索引0)两次:

...
Row row = sheet.createRow(ref.getRow());
...

如果ref引用A1,则会创建行0,如果ref引用J1,则会再次创建行0。两次都会创建 new 空行0。因此,该行中第一个创建的单元格将丢失。

在创建新行之前,您必须检查该行是否已存在:

...
Row row = sheet.getRow(ref.getRow());
if (row == null) row = sheet.createRow(ref.getRow());
...

答案 1 :(得分:0)

请看这个链接:

http://poi.apache.org/apidocs/org/apache/poi/POIXMLDocument.html#close%28%29

来自write()的文档:

"将此文档写出到Outputstream。注意 - 如果文档是从文件而不是InputStream打开的,则必须写出不同的文件,通过OutputStream覆盖是不可能的。"