【问题标题】:Wrong value / Number stored as Text - Apache POI存储为文本的错误值/数字 - Apache POI
【发布时间】:2018-10-31 18:38:57
【问题描述】:

我正在开发一个从 excel 文件中获取数据并在几次操作后输出一个 excel 的应用程序。 我有 2 个问题,第一个是那个:

在我的主 excel 文件上,我有这个值 170299024773,在 Excel 中它看起来像 1.703E+11,然后在输出文件上我得到 1.70299E+11,确切的值是 170299000000。 如您所见,这不是主文件的值。 此外,对于这个单元格,我有错误“数字存储为文本”,然后我从 Excel 中修复了这个错误,我得到了1.70E+11

我看到了一些关于 Nember 存储文本,特别是 DataFormatter 的提示,但在我的情况下它并没有改变任何东西

我用来获取excel表格数据到数组的代码:

private static String[][] sheetToArray(org.apache.poi.ss.usermodel.Sheet sheet, int nbCol){
    String[][] tmp = new String[sheet.getLastRowNum()+1][nbCol];

        for (int i = 0; i < sheet.getLastRowNum()+1; i++) { //Config1 to array
            Row row = sheet.getRow(i);
            DataFormatter df = new DataFormatter();
                for (int j = 0; j < nbCol; j++) {
                    Cell cellC1 = row.getCell(j);
                     tmp[i][j] = df.formatCellValue(cellC1);
                }
            }
        return tmp;
    }

非常感谢各位...

编辑:我修复了错误的值添加

switch (cellD2.getCellTypeEnum()){
       case STRING:
             tmp[i][j] = df.formatCellValue(cellC1);
             break;
        case NUMERIC:
             tmp[i][j] = String.valueOf(cellC1.getNumericCellValue());
        }
 }

但是现在,我的数字状态中添加了一些十进制值...要解决它,我应该使用 DataFormatter 但在这种情况下,我会丢失正确的数据

【问题讨论】:

标签: java arrays excel apache-poi output


【解决方案1】:

当使用DataFormatter 时,无需确定单元格类型。 DataFormatter 将始终获得 String 的值,并且它们显示在 Excel 单元格中(并非在所有情况下都如编辑栏中所示)。因此,如果单元格显示1,70299E+11,那么DataFormatter 也会得到“1,70299E+11”。如果这不是想要的值,则必须告知 DataFormatter 除了将单元格格式解释为 Excel 会做的那样之外,它还能做什么。

例如,如果使用单元格格式Generalexcelcells 中的值170299024773 将显示为1,70299E+11。如果这是不需要的,则必须在Excel 中更改单元格格式。例如,使用数字格式0 意味着:尽可能显示整数值。或者 DataFormatter 必须被告知它将解释单元格格式 GeneralExcel 不同。

以下显示如何告诉DataFormatter 它将单元格格式General 解释为#.###############

Excel:

代码:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;

import java.io.FileInputStream;

class ExcelDataformatterLikeCalcExample {

 public static void main(String[] args) throws Exception {

  Workbook wb  = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

  DataFormatter df = new DataFormatter();

  df.addFormat("General", new java.text.DecimalFormat("#.###############"));

  Sheet sheet = wb.getSheetAt(0);
  for (Row row : sheet) {
   for (Cell cell : row) {

     String value = df.formatCellValue(cell);
     System.out.println(value);

   }
  }
  wb.close();

 }

}

结果:

axel@arichter:~/Dokumente/JAVA/poi/poi-4.0.0$ java -cp .:./*:./lib/*:./ooxml-lib/* ExcelDataformatterLikeCalcExample 
170299024773

【讨论】:

  • 非常感谢您的解释,我更清楚它是如何工作的! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2022-03-15
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多