- 浏览: 536261 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zfx1982:
楼主能把doubango和webrtc2sip的源码发我一份么 ...
CentOS下编译webrtc2sip实战 -
zfx1982:
请问在编译doubango的时候configure总是说少sr ...
CentOS下编译webrtc2sip实战 -
cgs1999:
845896876 写道老师你好,我发现// 自定义属性 ...
使用Java操作LDAP案例 -
845896876:
老师你好,我发现// 自定义属性 a ...
使用Java操作LDAP案例 -
myitela:
NAT即地址转换,也可以是内网地址与外网地址的转换。如nat1 ...
NAT与NAT穿越学习总结
1、引言
由于系统需要提供给用户导入Excel文件数据的功能,但Excel文件有97-2003和2007+两种格式,且要求给用户有较大的灵活性。导入Excel文件的处理无非就是读取Excel文件的内容,然后根据一定的业务规则进行校验,校验正确后处理写入系统。对Excel文件的读取可通过JXL或POI两个Jar来完成,决定使用POI来开发,但POI对两种格式的处理又有所不同,那么如何通过POI灵活读取Excel文件的内容呢?
2、分析
Excel文件的读取有以下读取情况
(1)读取整个工作表中的所有内容
(2)读取工作表中指定区域块的内容
(3)读取工作表中指定行列的内容
(4)读取工作表中指定单元格的内容
情况(2)中,当区域块的内容为整个工作表的内容时,即为情况(1),也就是说情况(1)为情况(2)的特例。
情况(3)中,当指定行列范围内容中的列范围连续时,即为情况(2),也就是说情况(2)为情况(3)的特例。
情况(4)中,当指定单元格内容中的行范围连续时,即为情况(3),也就是说情况(3)为情况(4)的特例。
从上述4种情况的分析可知,前3种情况均可视为情况(4)的特例,从而将工作表范围转化为指定单元格范围的处理。由于指定单元格范围可能存在上述的4种情况,因而提供灵活的并且能够覆盖这些情况的配置方式显得尤为关键。
行列范围参数中均采用“,”作为不连续值的分割符,采用“-”作为两个连续值的连接符,这样简化了用户的参数配置,同时也保留了配置的灵活性,例如:
(1)12- 表示查询范围为从第十二行(列)到EXCEL中有记录的最后一行(列);
(2)12-24 表示查询范围为从第十二行(列)到第二十四行(列);
(3)12-24,30 表示查询范围为从第十二行(列)到第二十四行(列)、第三十行(列)等;
3、解决过程
(1)POI处理
对Excel的读取,主要涉及工作薄、工作薄、行数据、单元格等的处理,POI对97-2003和2007+两个版本的处理采用不同的类,如下图所示。
其中:
a)Workbook、Sheet、Row、Cell等为接口;
b)HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell为97-2003版本对应的处理实现类;
c)XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell为2007+版本对应的处理实现类;
(2)针对POI接口统一Excel处理类PoiExcelHelper
(3)97-2003格式Excel文件处理类PoiExcel2k3Helper
(4)2007+新格式Excel文件处理类PoiExcel2k7Helper
(5)测试类PoiExcelTest
4、详细请查阅代码(点击这里下载),代码为Maven项目,依赖的包如下
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
dom4j-1.6.1.jar
stax-api-1.0.1.jar
xmlbeans-2.3.0.jar
由于系统需要提供给用户导入Excel文件数据的功能,但Excel文件有97-2003和2007+两种格式,且要求给用户有较大的灵活性。导入Excel文件的处理无非就是读取Excel文件的内容,然后根据一定的业务规则进行校验,校验正确后处理写入系统。对Excel文件的读取可通过JXL或POI两个Jar来完成,决定使用POI来开发,但POI对两种格式的处理又有所不同,那么如何通过POI灵活读取Excel文件的内容呢?
2、分析
Excel文件的读取有以下读取情况
(1)读取整个工作表中的所有内容
(2)读取工作表中指定区域块的内容
(3)读取工作表中指定行列的内容
(4)读取工作表中指定单元格的内容
情况(2)中,当区域块的内容为整个工作表的内容时,即为情况(1),也就是说情况(1)为情况(2)的特例。
情况(3)中,当指定行列范围内容中的列范围连续时,即为情况(2),也就是说情况(2)为情况(3)的特例。
情况(4)中,当指定单元格内容中的行范围连续时,即为情况(3),也就是说情况(3)为情况(4)的特例。
从上述4种情况的分析可知,前3种情况均可视为情况(4)的特例,从而将工作表范围转化为指定单元格范围的处理。由于指定单元格范围可能存在上述的4种情况,因而提供灵活的并且能够覆盖这些情况的配置方式显得尤为关键。
行列范围参数中均采用“,”作为不连续值的分割符,采用“-”作为两个连续值的连接符,这样简化了用户的参数配置,同时也保留了配置的灵活性,例如:
(1)12- 表示查询范围为从第十二行(列)到EXCEL中有记录的最后一行(列);
(2)12-24 表示查询范围为从第十二行(列)到第二十四行(列);
(3)12-24,30 表示查询范围为从第十二行(列)到第二十四行(列)、第三十行(列)等;
3、解决过程
(1)POI处理
对Excel的读取,主要涉及工作薄、工作薄、行数据、单元格等的处理,POI对97-2003和2007+两个版本的处理采用不同的类,如下图所示。
其中:
a)Workbook、Sheet、Row、Cell等为接口;
b)HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell为97-2003版本对应的处理实现类;
c)XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell为2007+版本对应的处理实现类;
(2)针对POI接口统一Excel处理类PoiExcelHelper
import java.util.ArrayList; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; /** * Excel统一POI处理类(针对2003以前和2007以后两种格式的兼容处理) * @author chengesheng * @date 2012-5-3 下午03:10:23 * @note PoiHelper */ public abstract class PoiExcelHelper { public static final String SEPARATOR = ","; public static final String CONNECTOR = "-"; /** 获取sheet列表,子类必须实现 */ public abstract ArrayList<String> getSheetList(String filePath); /** 读取Excel文件数据 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex) { return readExcel(filePath, sheetIndex, "1-", "1-"); } /** 读取Excel文件数据 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows) { return readExcel(filePath, sheetIndex, rows, "1-"); } /** 读取Excel文件数据 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String[] columns) { return readExcel(filePath, sheetIndex, "1-", columns); } /** 读取Excel文件数据,子类必须实现 */ public abstract ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, String columns); /** 读取Excel文件数据 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, String[] columns) { int[] cols = getColumnNumber(columns); return readExcel(filePath, sheetIndex, rows, cols); } /** 读取Excel文件数据,子类必须实现 */ public abstract ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, int[] cols); /** 读取Excel文件内容 */ protected ArrayList<ArrayList<String>> readExcel(Sheet sheet, String rows, int[] cols) { ArrayList<ArrayList<String>> dataList = new ArrayList<ArrayList<String>> (); // 处理行信息,并逐行列块读取数据 String[] rowList = rows.split(SEPARATOR); for (String rowStr : rowList) { if (rowStr.contains(CONNECTOR)) { String[] rowArr = rowStr.trim().split(CONNECTOR); int start = Integer.parseInt(rowArr[0]) - 1; int end; if (rowArr.length == 1) { end = sheet.getLastRowNum(); } else { end = Integer.parseInt(rowArr[1].trim()) - 1; } dataList.addAll(getRowsValue(sheet, start, end, cols)); } else { dataList.add(getRowValue(sheet, Integer.parseInt(rowStr) - 1, cols)); } } return dataList; } /** 获取连续行、列数据 */ protected ArrayList<ArrayList<String>> getRowsValue(Sheet sheet, int startRow, int endRow, int startCol, int endCol) { if (endRow < startRow || endCol < startCol) { return null; } ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); for (int i = startRow; i <= endRow; i++) { data.add(getRowValue(sheet, i, startCol, endCol)); } return data; } /** 获取连续行、不连续列数据 */ private ArrayList<ArrayList<String>> getRowsValue(Sheet sheet, int startRow, int endRow, int[] cols) { if (endRow < startRow) { return null; } ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); for (int i = startRow; i <= endRow; i++) { data.add(getRowValue(sheet, i, cols)); } return data; } /** 获取行连续列数据 */ private ArrayList<String> getRowValue(Sheet sheet, int rowIndex, int startCol, int endCol) { if(endCol < startCol) { return null; } Row row = sheet.getRow(rowIndex); ArrayList<String> rowData = new ArrayList<String>(); for (int i = startCol; i <= endCol; i++) { rowData.add(getCellValue(row, i)); } return rowData; } /** 获取行不连续列数据 */ private ArrayList<String> getRowValue(Sheet sheet, int rowIndex, int[] cols) { Row row = sheet.getRow(rowIndex); ArrayList<String> rowData = new ArrayList<String>(); for (int colIndex : cols) { rowData.add(getCellValue(row, colIndex)); } return rowData; } /** * 获取单元格内容 * * @param row * @param column * a excel column string like 'A', 'C' or "AA". * @return */ protected String getCellValue(Row row, String column) { return getCellValue(row,getColumnNumber(column)); } /** * 获取单元格内容 * * @param row * @param col * a excel column index from 0 to 65535 * @return */ private String getCellValue(Row row, int col) { if (row == null) { return ""; } Cell cell = row.getCell(col); return getCellValue(cell); } /** * 获取单元格内容 * * @param cell * @return */ private String getCellValue(Cell cell) { if (cell == null) { return ""; } String value = cell.toString().trim(); try { // This step is used to prevent Integer string being output with // '.0'. Float.parseFloat(value); value=value.replaceAll("\\.0$", ""); value=value.replaceAll("\\.0+$", ""); return value; } catch (NumberFormatException ex) { return value; } } /** * Change excel column letter to integer number * * @param columns * column letter of excel file, like A,B,AA,AB * @return */ private int[] getColumnNumber(String[] columns) { int[] cols = new int[columns.length]; for(int i=0; i<columns.length; i++) { cols[i] = getColumnNumber(columns[i]); } return cols; } /** * Change excel column letter to integer number * * @param column * column letter of excel file, like A,B,AA,AB * @return */ private int getColumnNumber(String column) { int length = column.length(); short result = 0; for (int i = 0; i < length; i++) { char letter = column.toUpperCase().charAt(i); int value = letter - 'A' + 1; result += value * Math.pow(26, length - i - 1); } return result - 1; } /** * Change excel column string to integer number array * * @param sheet * excel sheet * @param columns * column letter of excel file, like A,B,AA,AB * @return */ protected int[] getColumnNumber(Sheet sheet, String columns) { // 拆分后的列为动态,采用List暂存 ArrayList<Integer> result = new ArrayList<Integer> (); String[] colList = columns.split(SEPARATOR); for(String colStr : colList){ if(colStr.contains(CONNECTOR)){ String[] colArr = colStr.trim().split(CONNECTOR); int start = Integer.parseInt(colArr[0]) - 1; int end; if(colArr.length == 1){ end = sheet.getRow(sheet.getFirstRowNum()).getLastCellNum() - 1; }else{ end = Integer.parseInt(colArr[1].trim()) - 1; } for(int i=start; i<=end; i++) { result.add(i); } }else{ result.add(Integer.parseInt(colStr) - 1); } } // 将List转换为数组 int len = result.size(); int[] cols = new int[len]; for(int i = 0; i<len; i++) { cols[i] = result.get(i).intValue(); } return cols; } }
(3)97-2003格式Excel文件处理类PoiExcel2k3Helper
import java.io.FileInputStream; import java.util.ArrayList; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; /** * Excel 读取(97-2003格式) * @author chengesheng * @date 2012-4-27 下午03:39:01 * @note PoiExcel2k3Helper */ public class PoiExcel2k3Helper extends PoiExcelHelper { /** 获取sheet列表 */ public ArrayList<String> getSheetList(String filePath) { ArrayList<String> sheetList = new ArrayList<String>(0); try { HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath)); int i = 0; while (true) { try { String name = wb.getSheetName(i); sheetList.add(name); i++; } catch (Exception e) { break; } } } catch (Exception e) { e.printStackTrace(); } return sheetList; } /** 读取Excel文件内容 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, String columns) { ArrayList<ArrayList<String>> dataList = new ArrayList<ArrayList<String>> (); try { HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath)); HSSFSheet sheet = wb.getSheetAt(sheetIndex); dataList = readExcel(sheet, rows, getColumnNumber(sheet, columns)); } catch (Exception e) { e.printStackTrace(); } return dataList; } /** 读取Excel文件内容 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, int[] cols) { ArrayList<ArrayList<String>> dataList = new ArrayList<ArrayList<String>> (); try { HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath)); HSSFSheet sheet = wb.getSheetAt(sheetIndex); dataList = readExcel(sheet, rows, cols); } catch (Exception e) { e.printStackTrace(); } return dataList; } }
(4)2007+新格式Excel文件处理类PoiExcel2k7Helper
import java.io.FileInputStream; import java.util.ArrayList; import java.util.Iterator; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * Excel 读取(2007+新格式) * @author chengesheng * @date 2012-4-27 下午03:39:01 * @note PoiExcel2k7Helper */ public class PoiExcel2k7Helper extends PoiExcelHelper { /** 获取sheet列表 */ public ArrayList<String> getSheetList(String filePath) { ArrayList<String> sheetList = new ArrayList<String>(0); try { XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filePath)); Iterator<XSSFSheet> iterator = wb.iterator(); while (iterator.hasNext()) { sheetList.add(iterator.next().getSheetName()); } } catch (Exception e) { e.printStackTrace(); } return sheetList; } /** 读取Excel文件内容 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, String columns) { ArrayList<ArrayList<String>> dataList = new ArrayList<ArrayList<String>> (); try { XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filePath)); XSSFSheet sheet = wb.getSheetAt(sheetIndex); dataList = readExcel(sheet, rows, getColumnNumber(sheet, columns)); } catch (Exception e) { e.printStackTrace(); } return dataList; } /** 读取Excel文件内容 */ public ArrayList<ArrayList<String>> readExcel(String filePath, int sheetIndex, String rows, int[] cols) { ArrayList<ArrayList<String>> dataList = new ArrayList<ArrayList<String>> (); try { XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filePath)); XSSFSheet sheet = wb.getSheetAt(sheetIndex); dataList = readExcel(sheet, rows, cols); } catch (Exception e) { e.printStackTrace(); } return dataList; } }
(5)测试类PoiExcelTest
import java.util.ArrayList; /** * Excel统一POI处理测试类(针对2003以前和2007以后两种格式的兼容处理) * @author chengesheng * @date 2012-5-3 下午03:10:23 * @note PoiHelper */ public abstract class PoiExcelTest { // ************************************************* // ================以下为测试代码==================== // ************************************************* public static void main(String[] args){ // 获取Excel文件的sheet列表 testGetSheetList("c:/test.xlsx"); // 获取Excel文件的第1个sheet的内容 testReadExcel("c:/test.xls", 0); // 获取Excel文件的第2个sheet的第2、4-7行和第10行及以后的内容 testReadExcel("c:/test.xlsx", 1, "2,4-7,10-"); // 获取Excel文件的第3个sheet中a,b,g,h,i,j等列的所有内容 testReadExcel("c:/test.xls", 2, new String[] {"a","b","g","h","i","j"}); // 获取Excel文件的第4个sheet的第2、4-7行和第10行及以后,a,b,g,h,i,j等列的内容 testReadExcel("c:/test.xlsx", 3, "2,4-7,10-", new String[] {"a","b","g","h","i","j"}); } // 测试获取sheet列表 private static void testGetSheetList(String filePath) { PoiExcelHelper helper = getPoiExcelHelper(filePath); // 获取Sheet列表 ArrayList<String> sheets = helper.getSheetList(filePath); // 打印Excel的Sheet列表 printList(filePath, sheets); } // 测试Excel读取 private static void testReadExcel(String filePath, int sheetIndex) { PoiExcelHelper helper = getPoiExcelHelper(filePath); // 读取excel文件数据 ArrayList<ArrayList<String>> dataList = helper.readExcel(filePath, sheetIndex); // 打印单元格数据 printBody(dataList); } // 测试Excel读取 private static void testReadExcel(String filePath, int sheetIndex, String rows) { PoiExcelHelper helper = getPoiExcelHelper(filePath); // 读取excel文件数据 ArrayList<ArrayList<String>> dataList = helper.readExcel(filePath, sheetIndex, rows); // 打印单元格数据 printBody(dataList); } // 测试Excel读取 private static void testReadExcel(String filePath, int sheetIndex, String[] columns) { PoiExcelHelper helper = getPoiExcelHelper(filePath); // 读取excel文件数据 ArrayList<ArrayList<String>> dataList = helper.readExcel(filePath, sheetIndex, columns); // 打印列标题 printHeader(columns); // 打印单元格数据 printBody(dataList); } // 测试Excel读取 private static void testReadExcel(String filePath, int sheetIndex, String rows, String[] columns) { PoiExcelHelper helper = getPoiExcelHelper(filePath); // 读取excel文件数据 ArrayList<ArrayList<String>> dataList = helper.readExcel(filePath, sheetIndex, rows, columns); // 打印列标题 printHeader(columns); // 打印单元格数据 printBody(dataList); } // 获取Excel处理类 private static PoiExcelHelper getPoiExcelHelper(String filePath) { PoiExcelHelper helper; if(filePath.indexOf(".xlsx")!=-1) { helper = new PoiExcel2k7Helper(); }else { helper = new PoiExcel2k3Helper(); } return helper; } // 打印Excel的Sheet列表 private static void printList(String filePath, ArrayList<String> sheets) { System.out.println(); for(String sheet : sheets) { System.out.println(filePath + " ==> " + sheet); } } // 打印列标题 private static void printHeader(String[] columns) { System.out.println(); for(String column : columns) { System.out.print("\t\t" + column.toUpperCase()); } } // 打印单元格数据 private static void printBody(ArrayList<ArrayList<String>> dataList) { int index = 0; for(ArrayList<String> data : dataList) { index ++; System.out.println(); System.out.print(index); for(String v : data) { System.out.print("\t\t" + v); } } } }
4、详细请查阅代码(点击这里下载),代码为Maven项目,依赖的包如下
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
dom4j-1.6.1.jar
stax-api-1.0.1.jar
xmlbeans-2.3.0.jar
评论
5 楼
sanri1993
2014-11-24
4 楼
synger99
2014-06-25
牛人!!!!!!!!!!!!!!!!!!!!
3 楼
cnkker
2013-10-22
高手啊...
膜拜
膜拜
2 楼
SoarDing
2013-06-24
很专业,很强大
1 楼
King_XR
2013-04-27
高手啊...
发表评论
-
MySQL中Update的执行效率测试及验证
2016-12-06 16:22 69071、引言 某日,在讨论解决生产环境的问题时,一同事问说增加条件 ... -
MySQL定时器实战
2016-11-29 17:38 21841、引言 项目商用环境上,用户反馈有个统计存在问题,排查后 ... -
用Java实现N*N的标准数独及对角线数独解题
2016-10-11 11:25 35481、引言 前一段时间迷 ... -
在Spring项目中实现动态创建数据库
2017-06-21 16:31 52711、问题描述 在使用Sprin ... -
改进现有架构支持HTTPS服务
2016-06-23 16:57 01、引言 nginx使用ssl模块配置HTTPS支持 ht ... -
CentOS下从源码安装Asterisk实战
2016-05-20 20:23 37200、引言 在研究WebRTC服 ... -
EasyUI学习(1)- 入门
2015-12-14 17:20 00、引言 前段时间,在项目开发过程中使用了EasyUI的部分组 ... -
JS实现的3级联动例子
2015-06-17 23:10 1391朋友项目需要实现3级联动,需要JS实现的,网上找的例子有些复杂 ... -
JSBuilder2介绍及应用范例
2014-08-27 17:58 01、引言 Web项目开发过程中,使用到多个第三方的插件,同时, ... -
实现CSS样式文件中图标的可视化
2014-06-26 14:39 5064关键词: CSS,EasyUI ... -
jquery选择器学习范例
2014-04-22 20:54 0http://www.w3school.com.cn/jque ... -
通过webrtc2sip实现web客户端sipML5与SIP客户端Jtisi对通
2014-01-13 19:53 00、引言 在研究WebRTC服 ... -
NAT与NAT穿越学习总结
2013-12-23 19:19 205141、引言网络地址转换 ... -
完全清除Desktop_1.ini和Desktop_2.ini
2013-12-06 17:21 72041、引言 Windows7工作机进入系统就会弹出“deskto ... -
CentOS下搭建Asterisk+SIPml5实战
2013-11-14 14:53 00、引言 在研究SIPml5信令处理时,需要搭建环境SIPml ... -
CentOS下编译webrtc2sip实战
2013-11-13 10:39 152990、引言 在研究WebRTC服 ... -
Java实现RTP流转发服务器
2013-10-24 17:36 00、引言 在做多方视频会议系统时,需要有代理服务器来转发视频平 ... -
利用mysql日志排查数据异常问题
2013-03-21 16:52 01、案例描述 2、MySQL日志 3、解决过程 (1) ... -
Java中通过MySQL的行锁解决并发写的问题
2012-12-22 12:45 01、案例描述 开发会议管理项目中,涉及会议管理系统和视频会议平 ... -
【算法】基于时间段的有限资源算法
2013-03-07 12:20 24351、案例描述 最近做会议管理系统,预约会议需要一个算法来判断在 ...
相关推荐
在这个"poi读取excel2007和2003兼容工具例子"中,我们将探讨如何使用POI来读取不同版本的Excel文件,特别是Excel 2003(.xls)和Excel 2007及更高版本(.xlsx)。 1. **Apache POI库**:Apache POI是Apache软件基金...
Excel 97 文件格式,也被称作BIFF8,是Excel从97到XP版本所使用的标准格式。尽管后来的Excel版本有所更新,但由于向后兼容性,BIFF8格式仍然广泛适用。在本文中,我们将主要讨论这个格式,因为它是POI HSSF支持的...
"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...
兼容03/07版Excel的功能意味着ExcelUtil支持两种主要的Excel文件格式:.xls(97-2003版本)和.xlsx(2007及以上版本)。这得益于Apache POI库的广泛支持。 总的来说,ExcelUtil通过结合反射和Apache POI库,极大地...
【Java读取Excel兼容2003和2007】 在Java中处理Excel文件时,我们需要确保代码能够兼容Microsoft Office的两个主要版本:2003和2007。这两个版本的Excel文件格式有所不同,2003使用的是.BIFF8格式(HSSF),而2007及...
Excel文件格式有两种主要版本,即2003的.xls(基于BIFF格式)和2007及以后版本的.xlsx(基于OpenXML标准)。为了确保程序能够兼容这两种格式,开发者通常会使用Apache POI库,这是一个强大的API,专门用于处理...
Excel文件格式主要有两种:xls(Excel 97-2003格式)和xlsx(Excel 2007及以后的Open XML格式)。为了在Java中实现对这两种格式的兼容性读取,我们可以利用Apache POI库,这是一个强大的开源Java API,专门用于处理...
本篇文章将深入探讨如何使用Apache POI来兼容并处理Excel 2003 (.xls)和Excel 2007 (.xlsx)这两种文件格式。 #### 知识点详解 **1. Apache POI的版本选择** - **Jar包列表**: - `dom4j-1.6.1.jar`: 提供DOM解析...
Excel文件格式有两种主要版本,即2003年的.xls格式和2007年及以后的.xlsx格式。为了兼容这两种格式,Java引入了Apache POI库,这是一个用于处理Microsoft Office文档的开源API。 Apache POI提供了HSSF(Horrible ...
Excel文件格式有两种主要版本,即2003年的.xls格式(基于Excel 97-2003)和2007年引入的.xlsx格式(基于Office Open XML)。为了兼容这两种格式,Java提供了多种库来实现读取功能。以下将详细介绍如何使用Java来读取...
描述中提到的"整合poi3.7所有jar包 能够完美的解析出2007和2003版本"意味着这个版本的POI能够兼容两种不同版本的Excel文件格式:.xls(2003及更早版本)和.xlsx(2007及更高版本)。.xlsx文件是基于Open XML标准的,...
这意味着你可以使用此版本的库来读取和写入2003年至2010年间的Excel文件,包括xls和xlsx两种格式。 - **读取功能**:POI提供了一系列的接口和类,如HSSFWorkbook(用于.xls文件)和XSSFWorkbook(用于.xlsx文件),...
这两种API在POI库中都是独立实现的,因此需要根据文件格式选择相应的API进行操作。 1. **HSSF与XSSF的使用**: - HSSF API适用于读写.xls文件,它提供了对Excel 97-2003格式的支持。 - XSSF API则用于读写.xlsx...
通过以上知识点的学习和实践,你可以掌握在Java中读取Excel文件,包括对Excel 2003和2007格式的兼容性处理。在实际应用中,可以根据需求进一步扩展功能,如写入Excel、合并单元格、格式化数据等。
3. **使用DHlibxls读取Excel文件**: - 首先,创建一个`XLS`对象来表示Excel文件。 - 然后,使用`openFile:`方法打开文件。 - 通过`workbook`属性访问工作簿,可以获取到工作表(worksheet)的数组。 - 对每个...
这个工程的目标是实现一个Java程序,能够读取Microsoft Excel的两种主要格式:.xls(用于2003及更早版本)和.xlsx(用于2007及更高版本)。 Excel 2003使用的是一种名为BIFF(Binary Interchange File Format)的二...
### Java使用POI读取Excel文件教程 #### 一、Excel基础 Microsoft Excel 97 文件格式被称为 BIFF8(Binary Interchange File Format),而之后的版本如 Excel 2000、2002 和 2003 对此格式进行了微小的改进。这些...
首先,Apache POI提供了两种主要的接口来处理Excel文件:HSSF(Horrible Spreadsheet Format)用于读写旧版的.BIFF8格式(即Excel 97-2003),而XSSF则用于读写基于OOXML的新版.XLSX格式。这个demo应该包含了对这两...
2. **POI-HSSF+XSSF**: HSSF是处理老版二进制Excel文件格式(.xls)的API,而XSSF则用于处理Open XML格式的Excel文件(.xlsx)。这两个库共同提供了对Excel文件的全面支持。 3. **POI-SXSSF**: SXSSF是提供内存优化...