所以我的Java代码是这样读取excel表格单元格值的,但是我不能以字符串的形式获得日期的值,而是自动更正为数字。还要注意,excel的所有这些值都是在各自的单元格中通过公式计算出来的。少了什么?
public class DatasheetReader {
public static void main(String args[]) throws Exception {
String path = "D:\\Workspace\\Analytics\\TestDataSheets\\IRPTestData.xlsx";
String sheet = "CompleteSimulationData";
getCellData(path, sheet);
}
public static Object[][] getCellData(String datSheetPath, String sheetName)throws Exception {
FileInputStream fis = new FileInputStream(new java.io.File(datSheetPath));
XSSFWorkbook workbook = new XSSFWorkbook(fis);
XSSFSheet sheet = workbook.getSheet(sheetName);
int rowCount = sheet.getPhysicalNumberOfRows();
int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
// System.out.println(rowCount);
// System.out.println(columnCount);
Object[][] cellData = new Object[rowCount][columnCount];
Object[][] dataProviderArray = new Object[rowCount - 1][columnCount];
for (int i = 0; i < rowCount; i++) {
System.out.println(" ");
for (int j = 0; j < columnCount; j++) {
// IF - for blanks in excel
if (i != 0) {
// IF - for not null values
if (sheet.getRow(i).getCell(j) != null) {
Cell cell = sheet.getRow(i).getCell(j);
int cellType = cell.getCachedFormulaResultType();
if(cellType==Cell.CELL_TYPE_NUMERIC){
System.out.println(cell.getNumericCellValue()+" "+cell.getCachedFormulaResultType());
}else if(cellType==Cell.CELL_TYPE_STRING){
System.out.println(cell.getRichStringCellValue()+" "+cell.getCachedFormulaResultType());
}
} else {
cellData[i][j] = "";
}
} else {
continue;
}
//System.out.println(cellData[i][j]);
}
}
for (int i = 1; i < rowCount; i++) {
for (int j = 0; j < columnCount; j++) {
//System.out.print(cellData[i][j] + " ");
dataProviderArray[i - 1][j] = cellData[i][j];
}
}
workbook.close();
return dataProviderArray;
}}
所有这些值都是根据公式计算的缓存值。
所有值都是按照预期得到的,除了日期,它是42887.0
而不是jun-2017
基本上所有的值都不是excel单元格中的单独值,而是根据公式计算的值,因为日期POI返回其类型为cell_type_numeric
,不明白如何处理,因为无法使用POI的DataFormat因为我要读取的所有值都是作为公式得到的?
下面的代码应该能够读取任何类型的Excel
单元格内容。我希望我没有忘记什么。
主要修改为Busy Developers‘Guide:获取单元格内容:
使用具有FormulaEvaluator
的DataFormatter
。
如果Cell.GetCellTypeEnum()
是CellType.Formula
,则再次检查Cell.GetCachedFormulaResultTypeEnum()
,并根据情况作出反应。
使用最新的稳定版本Apache POI3.16
工作。不使用较低版本。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.usermodel.CellType.*;
import java.io.FileInputStream;
class ReadExcelExample {
public static void main(String[] args) throws Exception {
Workbook wb = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
System.out.print(cellRef.formatAsString());
System.out.print(" - ");
// get the text that appears in the cell by getting the cell value and applying any data formats (Date, 0.00, 1.23e9, $1.23, etc)
String text = "";
try {
text = formatter.formatCellValue(cell, evaluator);
} catch (org.apache.poi.ss.formula.eval.NotImplementedException ex) {
text = "Formula not implemented";
}
System.out.println(text);
// Alternatively, get the value and format it yourself
switch (cell.getCellTypeEnum()) {
case STRING:
System.out.println(cell.getRichStringCellValue().getString());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case FORMULA:
System.out.println(cell.getCellFormula());
switch (cell.getCachedFormulaResultTypeEnum()) {
case STRING:
System.out.println(cell.getRichStringCellValue().getString());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case ERROR:
System.out.println(cell.getErrorCellValue());
break;
default:
System.out.println("default formula cell"); //should never occur
}
break;
case ERROR:
System.out.println(cell.getErrorCellValue());
break;
case BLANK:
System.out.println("blank");
break;
default:
System.out.println("default cell"); //should never occur
}
}
}
wb.close();
}
}
我正在尝试使用apache poi库来读取excel。我想将日期字段转换为字符串值。因此,我使用了以下代码: 我的约会方式很奇怪
问题内容: 我正在使用Apache POI库读取Excel文件。我在读取密码单元时被卡住了。如果用户在密码单元格中输入日期作为密码,即16/05/2012。我正在将此值读取为“ 41045”,而该值应为“ 16/05/2012”。这是我的代码: 有人可以帮忙吗? 谢谢。 问题答案: 您在POI中寻找的类是DataFormatter 当Excel写入文件时,某些单元格将存储为文字字符串,而另一些单元
似乎这里和这里已经有了答案,但是,这些解决方案都不适合我。 我正在努力 不管怎样,最后仍然包含第一张而不是第二张。我使用的是Python 3和Pandas 0.20。1(水蟒发行版)。我错过了什么?如何将第二张图纸加载到?
我有一个Java代码显示的内容的excel表。现在,当我处理数值/字符串/布尔数据时,它总是给出正确的结果。不同的是,为了测试我的代码,我在Excel中做了很少的改动,并添加了一个日期值(例如4-SEP-09)。在运行我的代码时,它返回了不想要的结果。代码和O/P如下所示。如何从excel表中读取和显示日期值?我在用阿帕奇POI。我可以执行类似的操作,检查单元格值是否为date,或者是否使用?这是
我的C#. Net应用程序通过使用excel公式字符串加载和读取excel工作表单元格值。 例如,excel工作表位置和选项卡名称及其单元格行/列将作为公式字符串提供。 'D:\DataX[数据.Xls]EOD'$A5级 根据上述公式-C#应用程序加载数据。Xls,并打开EOD选项卡,应读取第5行A列值。 寻找在C#中完成的最佳方式。Net框架。
如何在Katalon Studio中从excel工作表(工作表1、工作表2...等)中读取数据。我可以从一张表中读取数据。但是我面临着多张纸的困难。