以前用java读Excel03,现在要升级到兼容07,搞了两天,搞定了,以前写过读03的,今天把07的贴上来。。。。
第一步,当然是引包了。。。要下载:xmlbeans-2.3.0.jar和poi-bin-3.7-20101029.tar.gz
org.apache.poi.ss.usermodel.DataFormatter,
org.apache.poi.ss.usermodel.DateUtil,
org.apache.poi.hssf.usermodel.HSSFCell,
org.apache.poi.xssf.usermodel.XSSFCell,
org.apache.poi.xssf.usermodel.XSSFRow,
org.apache.poi.xssf.usermodel.XSSFSheet,
org.apache.poi.xssf.usermodel.XSSFWorkbook"
InputStream inputStream = null; /// 图片字节流
SmartUpload su = new SmartUpload(); /// 上传文件组件
jxl.Workbook rwb = null;
// 上传初始化
su.initialize(pageContext);
try{
// 上传文件
su.upload();
com.jspsmart.upload.File file = su.getFiles().getFile(0);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int j = 0; j < file.getSize(); j++) {
baos.write(file.getBinaryData(j));
}
inputStream = new ByteArrayInputStream(baos.toByteArray());
if(type.equals(".xls")){
rwb = Workbook.getWorkbook(inputStream);
Sheet sheet = rwb.getSheet(0);
int iRow = sheet.getRows();
int iColumn = sheet.getColumns();
}else if(type.equals("xlsx")){ ///加入对07文档的支持
XSSFWorkbook xwb = null;
xwb = new XSSFWorkbook(inputStream); // 构造 XSSFWorkbook 对象
// 循环工作表Sheet
XSSFSheet xSheet = xwb.getSheetAt(0);
int iRow = xSheet.getLastRowNum();
XSSFRow xRow = xSheet.getRow(0);
int iColumn = xRow.getLastCellNum();
行循环时:for(int m=1;m<xSheet.getLastRowNum()+1;m++)
PS:也可以不用new XSSFWorkbook(inputStream)这个构造方法,而是用String fileName = "G:/batchcard.xlsx"; xwb = new XSSFWorkbook(fileName);
当然,前提是你已经知道要读哪个确定的文件。如果是用户自己上传的,还是上面的吧,呵。。。
这样就成功读到数据了。。。。。。。。。
然后要说具体读哪个单元格的数据:
它不像03一样,可以用sheet.getCell(5,0).getContents();来搞定,07有点麻烦。。。。
首先,要定位到行:XSSFRow xRow = xSheet.getRow(1);然后定位到单元格
if(xRow == null){
System.out.println("empty");
}else{
XSSFCell xCell = xRow.getCell(2);
}
对于要读成字符串的,比较简单,可以用System.out.println(xCell.toString());
也可以用:
xCell.setCellType(HSSFCell.CELL_TYPE_STRING);
System.out.println(xCell.getStringCellValue());
对于日期的处理,哎,真麻烦。。。
要定位到单元格之后,
String s = "";
if(DateUtil.isCellDateFormatted(xCell)){
s = new DataFormatter().formatRawCellContents(xCell.getNumericCellValue(), 0, "yyyy-mm-dd");// 格式化
}else{
////数据中的日期格式有误
}