51,411
社区成员
发帖
与我相关
我的任务
分享excel版本为excel2007.
我需要创建一个公共方法来获取excel中的数据。excel中的日期和数字格式都是用数字存储的,现在先不考虑如何区分到底是日期还是数字,先假定传入的数据肯定为自定义的日期格式。
我需要在不预先知道excel中的格式并且也无法强制规定格式的情况下,在java中获取于在excel中所见一致的数据。比如
excel中设定的格式 Excel中看到的结果
mmmm\-yy January-21
yyyym"月"d"日" 20211月2日

测试用的java代码
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
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.model.StylesTable;
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.XSSFWorkbook;
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a1 = "E:\\tmp\\222.xlsx";
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(a1);
XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
Sheet ffSheet = sheets.getSheetAt(0);
Row row = ffSheet.getRow(0);
Cell cell = row.getCell(0);
getCellValue((XSSFCell)cell);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(fileInputStream != null)
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// yyyy/mm/dd --> m/d/yy
// m/d/yy --> reserved-0x1E
// m/d ok
// m/d\ hh ok
// yyyym"月"d"日" ok
// yyyy"年"m"月"d"日" no
// yyyy"年"m"月"d"日";@ ok
// yyyy" aaaaa"m"月"d"日" 变成数字
// mmmm\-yy January-21 --> 一月-21
private static String getCellValue(XSSFCell cell){
XSSFCellStyle style = cell.getCellStyle();
System.out.println(cell.getCellStyle().getDataFormatString());
// System.out.println(cell.getDateCellValue());
DataFormatter df = new DataFormatter();
System.out.println(df.formatCellValue(cell));
System.out.println(df.formatCellValue(cell).replace("\"", ""));
return "";
}
}
现在遇到的问题是,一部分在excel中正确显示的格式,在java中无法获取,甚至格式format都无法正确获取,目前发现的有:
excel中yyyy/m/d格式在java中会变为m/d/yy,m/d/yy则会变成乱码(reserved-0x1E),yyyy/mm/dd倒是可以正常显示。
excel中的yyyy"年"m"月"d"日"会读取成乱码,但是yyyy"年"m"月"d"日";@或者yyyym"月"d"日"可以正常读取
excel中mmmm\-yy显示为January-21,但是我在java中读出了一月-21。
等等。。。
要如何修改上面的getCellValue方法,来处理所有的自定义日期类型?
NPOI不知道咋解决,我用过Free Spire.XLS,它有一个getDisplayedText方法,可以获取Excel单元格的显示文本,不管当前设置的格式是什么,我写了个读取Excel的sample,你测试下有没有解决你的问题
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
public class ReadExcel {
public static void main(String []args) throws Exception {
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.xlsx");
Worksheet sheet = workbook.getWorksheets().get(0);
int maxRow = sheet.getLastRow();
int maxColumn = sheet.getLastColumn();
for (int row = 1; row <= maxRow; row++)
{
for (int col = 1; col <= maxColumn; col++)
{
String text = sheet.getCellRange(row, col).getDisplayedText();
System.out.print(text + "\t\t");
}
System.out.print("\n");
}
}
}
没遇到过你的问题, 以前遇到的excel导入数据都是强制要求excel模板中日期单元格格式是指为文本, 然后硬编码转换