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

Apache POI setCellType未正确设置数值的单元格类型

欧阳俊逸
2023-03-14

我正试图将一些数据导出到Excel文件中。我在用POI。

据我所知,Cell.SetCellType(double)设置适当的excel等效数值。但这不会改变细胞的类型。

打开生成的excel文件时的列类型是开始选项卡中的General

package com.example;

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);

        cell.setCellValue(3.14159);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}
package com.example;

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);

        cell.setCellValue(3.14159);
        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}

编辑

正如Jim Garrison回答的那样,设置单元格样式确实会将类型改为数字。下面是工作代码。

package com.example;

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);

        cell.setCellValue(3.14159);
        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);

        XSSFDataFormat format = workbook.createDataFormat();
        XSSFCellStyle style = workbook.createCellStyle(); 
        style.setDataFormat(format.getFormat("0.0"));

        cell.setCellStyle(style);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}

共有1个答案

孔梓
2023-03-14

从Javadoc forsetcellvalue(双值)(强调是我的):

value-要将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数值,我们将设置它的值。对于其他类型,我们将把单元格更改为数字单元格并设置其值。

因此,无论以前的单元格是什么,该方法都会将单元格类型更改为numeric。

 类似资料:
  • 我已经设置了一个谷歌工作表,它附带了一个脚本,运行一个函数来提取chromebook设备信息,除了我感兴趣的两个字段,“cpuStatusReports”和“diskVolumeReports”之外,效果非常好。脚本记录器确实显示了正确的信息,但我的工作表单元格值设置为例如 {cpuUtilizationPercentageInfo=[Ljava.lang.Object;@d151552,cpuT

  • 我需要将Excel行从一张工作表复制到另一张工作表。但是在复制而不是实际值之后,我得到了不同的值。有字符串值的单元格没有问题,但有数值的单元格没有问题。Excel单元格可以包含任何类型的值。我的代码应该接受所有这些内容,并将它们复制到另一张表中。请帮我解决这个问题。 我知道row.get单元格(二)"是转换类型单元格字符串,但我想设置setCellValue接受单元格,可以有任何类型的数据(例如:

  • 我的笔记本电脑上安装了Java14和Java8,但默认情况下我想使用8,所以我尝试将我的java_HOME设置为使用-V1.8。 在~/。bash_profile我添加了一行。执行此操作后,立即返回正确的路径,返回正确的版本。然而,如果我关闭终端并再次打开它,将产生一个空行,显示JAVA 14。编辑之后。bash_profile我做的当我重新打开终端并执行行设置JAVA_HOME仍然存在。为什么我

  • 我正在使用谷歌表单作为日常仪表板。我需要的是根据另一个单元格C5的值更改单元格B5的背景色。如果C5大于80%,则背景色为绿色,但如果低于,则为琥珀色/红色。 这是Google Sheets功能提供的还是我需要插入脚本?

  • 我无法将此行的样式设置为: 它给我的错误是“无法在基元类型void上调用setCellValue(String)”。这种情况下的错误是什么?我如何在单行代码中实现所有3个目标?

  • 我有一个类似于这个和这个的问题。区别在于我必须按位置选择行,因为我不知道索引。 我想做一些类似于,但iloc不允许这种访问。如果我执行,则会出现关于链接索引的警告。