当前位置: 首页 > 知识库问答 >
问题:

JavaSpring apache POI,在Excel中存储长数字,没有指数

东郭源
2023-03-14

我试图在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:1234567891012122222

请帮帮我,任何指点都会很有帮助。

共有1个答案

唐高朗
2023-03-14

我永远不会将数值存储为文本。使用数字格式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(); 
 }

}
 类似资料:
  • 问题内容: 如何在Java中存储一组成对的数字?我使用列表或数组,还是其他? 例如。[(1,1),(2,1),(3,5)] 问题答案: 有几种选择: 编写自定义的IntPair类 然后创建一个或一个。 或者,创建一个二维数组,并将行视为对。 Java没有内置类的几个原因,但最引人注目的是,它是很容易写出具有相同功能的类,但 很多 更多的启发,有帮助的名称为类,其字段,以及它的方法。 如果我们更多地

  • 我用雷迪森换雷迪斯。我已经在我的本地系统上安装了Redis。我已经编写了以下代码并运行了它: 但是,当我进入redis-cli并尝试检索该键时,我得到这是为什么?为什么它不把数据推入Redis?

  • 问题内容: 我是JAVA的初学者,我正在编写这段代码,该代码应该接收字符串数组并将每个字符串(数组元素)分别存储在指定的变量中。但是它仅存储第一个元素。下面是代码: 问题答案:

  • 问题内容: 我有一个Spring应用程序,该应用程序使用最初由Spring Roo创建的JPA( Hibernate )。我需要存储任意长度的字符串,因此,我用 @Lob 注释了该字段: 该应用程序可以在本地主机上正常运行,但是我已将其部署到外部服务器,并且出现了编码问题。因此,我想检查存储在PostgreSQL数据库中的数据是否正确。该应用程序自动创建/更新表。并且为该字段(消息)创建了一个类型

  • 在调用chaincode时,数据被正确读取。我们使用Println语句对此进行了检查。但是调用的数据不会存储在区块链网络中。它引发以下错误。“错误:发送调用事务时出错:无法发送:EOF-建议响应:版本:1响应:<状态:200有效负载:”101“”。 这该如何整治? 我试着在我本地的第一个网络中测试相同的链码,我能够在区块链中保存数据并检索相同的数据。我在kubernetes集群中测试代码时面临这个

  • 问题内容: 我们正在捕获大小可变(从100k到800k)的原始二进制字符串,并且我们想存储这些单独的字符串。它们不需要索引(duh),并且不会对该字段的内容进行任何查询。 这些插件的数量将非常大(用于存档),例如每天10,000。像这样的大型二进制字符串的最佳字段类型是什么?应该是还是其他? 问题答案: 就 PostgreSQL 而言,类型是不可能的。与目标相比,它更慢,占用更多空间并且更容易出错