Java Spring apache POI,在没有指数的情况下在excel中存储长号

时间:2018-04-19 10:19:25

标签: java excel spring apache-poi

我试图在excel中插入BigDecimal值,但它以指数值存储。

该值以下面的代码存储为指数值: i / p:1234567891012.12 o / p:1.23457E + 12

cell = rowhead.createCell(cellnumberno++);
        cell.setCellStyle(wrapRightDataNoBottomCellStyle);
        cell.setCellValue(Double.parseDouble(cellValue));

当我试图在下面的Excel中插入值时,我得到的错误就像"数字被称为字符串": i / p:1234567891012.12 o / p:1234567891012.12带感叹号

cell = rowhead.createCell(cellnumberno++);
        cell.setCellStyle(wrapRightDataNoBottomCellStyle);
        cell.setCellValue(cellValue);

有没有办法删除这个数字,在输入值之前会从java代码中存储为文本错误。

格式如下工作正常,但我不想限制小数后的数字。

   XSSFDataFormat format=wb.createDataFormat();
   wrapRightDataNoBottomCellStyle.setDataFormat(format.getFormat("0.00"));
   cell.setCellStyle(wrapRightDataNoBottomCellStyle);
   cell.setCellValue(Double.parseDouble(cellValue)); 

我不想用这样的东西格式化单元格" 0.00",有没有办法可以将单元格格式设置为文本然后输入值并仍然将数字作为文本错误避免?

我想通过避免"数字存储为文本"将excel中的长十进制像下面一样插入字符串中。错误。 输入:1234567891012.12222 预期o / p:1234567891012.122222

请帮助我,任何指示都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

我永远不会将数值存储为文本。使用数字格式0.0##############可以满足具有所需数量小数位数且不切换到指数的数字单元格内容的要求。每个#表示:如果需要,请使用此数字。如果需要,始终显示小数点前的数字。所以只需要一个0。格式表示整体:小数点前至少一位数,至少一位小数,但如果需要,最多15位小数位。 Excel始终存储浮点值,最多只能存储15位有效数字。这就是为什么超过15个小数位无效。

但如果要求确实是,将数值存储为文本,那么也可以使用数字格式@。这是“文本”数字格式。要避免“存储为文本的数字”警告,如果Excel的类型为XSSF,则可以使用XSSFSheet.addIgnoredErrors

示例:

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.CellReference;

public class ExcelStoreBigNumbers {

 public static void main(String[] args) throws Exception {
  String valueInput = "123456789012.12345";

  Workbook workbook = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet();

  CellStyle style;
  DataFormat format = workbook.createDataFormat();
  Row row;
  Cell cell;

  //numeric cell value formatted having as much decimal places as needed
  style = workbook.createCellStyle();
  style.setDataFormat(format.getFormat("0.0##############"));
  row = sheet.createRow(0);
  cell = row.createCell(0);
  cell.setCellStyle(style);
  cell.setCellValue(Double.parseDouble(valueInput)); //precision only up to 15 significant digits

  //string cell value formatted as text
  style = workbook.createCellStyle();
  style.setDataFormat(format.getFormat("@"));
  row = sheet.createRow(1);
  cell = row.createCell(0);
  cell.setCellStyle(style);
  cell.setCellValue(valueInput);

  //avoiding "number stored as text" warning
  if (sheet instanceof XSSFSheet) {
   ((XSSFSheet)sheet).addIgnoredErrors(new CellReference(cell), IgnoredErrorType.NUMBER_STORED_AS_TEXT);
  }

  sheet.autoSizeColumn(0);

  workbook.write(new FileOutputStream("ExcelStoreBigNumbers.xlsx"));
  workbook.close(); 
 }

}