03版读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ReadExcel03 { /** * 读取excel * @param is * @return * @throws FileNotFoundException * @throws IOException */ public static List<List<String>> readExcel(InputStream is)throws FileNotFoundException, IOException { // 构造 HSSFWorkbook 对象,传入参数为excel文件的io流 HSSFWorkbook wb = new HSSFWorkbook(is); // 读取第一个sheet的内容 HSSFSheet sheet = wb.getSheetAt(0); // 获取所有行的迭代对象 Iterator<Row> rowIter = sheet.rowIterator(); // 获取合并单元格对象的相关信息 List<ExcelMergedRegionBean> mergedRegionMapList = new CopyOnWriteArrayList<ExcelMergedRegionBean>(getMergedRegionMapList(sheet)); List<List<String>> contentList = new ArrayList<List<String>>(); // 迭代所有行 while (rowIter.hasNext()) { List<String> cellList = new ArrayList<String>(); // 获取每一行 Row row = rowIter.next(); // 获取该行的列迭代对象 Iterator<Cell> cellIter = row.cellIterator(); // 迭代该行的每一列 while (cellIter.hasNext()) { // 获取该行的每一列 Cell cell = cellIter.next(); // 获取该单元格的值 String content = getActualCellValue(sheet, mergedRegionMapList,cell); cellList.add(content); } contentList.add(cellList); } return contentList; } /** * 获取单元格真实的值 * @param sheet * @param mergedRegionMapList * @param myCell * @return */ public static String getActualCellValue(HSSFSheet sheet,List<ExcelMergedRegionBean> mergedRegionMapList, Cell myCell) { Cell actualCell = myCell; // 迭代合并单元格对象,判断myCell该对象是否属于合并单元格 for (ExcelMergedRegionBean mb : mergedRegionMapList) { if (myCell.getRowIndex() > mb.getLastRow()) { mergedRegionMapList.remove(mb); } // 判断myCell该对象是否属于合并单元格,如果是的话,则直接退出循环 if (myCell.getColumnIndex() <= mb.getLastCell() && myCell.getColumnIndex() >= mb.getFirstCell() && myCell.getRowIndex() <= mb.getLastRow() && myCell.getRowIndex() >= mb.getFirstRow()) { Row row = sheet.getRow(mb.getFirstRow()); Cell cell = row.getCell(mb.getFirstCell()); actualCell = cell; break; } } // 返回该单元对应的真实值 return getCellValue(actualCell); } /** * 处理合并的列 * @param sheet * @return */ public static List<ExcelMergedRegionBean> getMergedRegionMapList(HSSFSheet sheet) { List<ExcelMergedRegionBean> mergedRegionMapList = new ArrayList<ExcelMergedRegionBean>(); // 获得一个 sheet 中合并单元格的数量 int sheetmergerCount = sheet.getNumMergedRegions(); // 便利合并单元格 for (int i = 0; i < sheetmergerCount; i++) { // 获得合并单元格 CellRangeAddress ca = sheet.getMergedRegion(i); // 获得合并单元格的起始行, 结束行, 起始列, 结束列 int firstC = ca.getFirstColumn(); int lastC = ca.getLastColumn(); int firstR = ca.getFirstRow(); int lastR = ca.getLastRow(); ExcelMergedRegionBean mb = new ExcelMergedRegionBean(); mb.setFirstRow(firstR); mb.setLastRow(lastR); mb.setFirstCell(firstC); mb.setLastCell(lastC); mergedRegionMapList.add(mb); } // 排序,便于后面循环删除 Collections.sort(mergedRegionMapList); return mergedRegionMapList; } /** * 获得单元格的值 * @param cell * @return */ public static String getCellValue(Cell cell) { String cellValue = ""; if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { cellValue = rPadZeroUtil(String.valueOf(cell.getNumericCellValue())); } else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) { cellValue = String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) { cellValue = cell.getStringCellValue(); } else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { cellValue = String.valueOf(cell.getCellFormula()); } return cellValue; } public static String rPadZeroUtil(String value) { if (value != null && !"".equals(value)) { if (value.endsWith(".0")) { return value.substring(0, value.indexOf(".0")); } } return value; } } 07版读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcel07 { /** * 读取excel * @param is * @return * @throws FileNotFoundException * @throws IOException */ public static List<List<String>> readExcel(InputStream is)throws FileNotFoundException, IOException { // 构造 XSSFWorkbook 对象,传入参数为excel文件的io流 XSSFWorkbook wb = new XSSFWorkbook(is); // 读取第一个sheet的内容 XSSFSheet sheet = wb.getSheetAt(0); // 获取所有行的迭代对象 Iterator<Row> rowIter = sheet.rowIterator(); // 获取合并单元格对象的相关信息 List<ExcelMergedRegionBean> mergedRegionMapList = new CopyOnWriteArrayList<ExcelMergedRegionBean>(getMergedRegionMapList(sheet)); List<List<String>> contentList = new ArrayList<List<String>>(); // 迭代所有行 while (rowIter.hasNext()) { List<String> cellList = new ArrayList<String>(); // 获取每一行 Row row = rowIter.next(); // 获取该行的列迭代对象 Iterator<Cell> cellIter = row.cellIterator(); // 迭代该行的每一列 while (cellIter.hasNext()) { // 获取该行的每一列 Cell cell = cellIter.next(); // 获取该单元格的值 String content = getActualCellValue(sheet, mergedRegionMapList,cell); cellList.add(content); } contentList.add(cellList); } return contentList; } /** * 获取单元格真实的值 * @param sheet * @param mergedRegionMapList * @param myCell * @return */ public static String getActualCellValue(XSSFSheet sheet,List<ExcelMergedRegionBean> mergedRegionMapList, Cell myCell) { Cell actualCell = myCell; // 迭代合并单元格对象,判断myCell该对象是否属于合并单元格 for (ExcelMergedRegionBean mb : mergedRegionMapList) { if (myCell.getRowIndex() > mb.getLastRow()) { mergedRegionMapList.remove(mb); } // 判断myCell该对象是否属于合并单元格,如果是的话,则直接退出循环 if (myCell.getColumnIndex() <= mb.getLastCell() && myCell.getColumnIndex() >= mb.getFirstCell() && myCell.getRowIndex() <= mb.getLastRow() && myCell.getRowIndex() >= mb.getFirstRow()) { Row row = sheet.getRow(mb.getFirstRow()); Cell cell = row.getCell(mb.getFirstCell()); actualCell = cell; break; } } // 返回该单元对应的真实值 return getCellValue(actualCell); } /** * 处理有合并的列 * @param sheet * @return */ public static List<ExcelMergedRegionBean> getMergedRegionMapList(XSSFSheet sheet) { List<ExcelMergedRegionBean> mergedRegionMapList = new ArrayList<ExcelMergedRegionBean>(); // 获得一个 sheet 中合并单元格的数量 int sheetmergerCount = sheet.getNumMergedRegions(); // 便利合并单元格 for (int i = 0; i < sheetmergerCount; i++) { // 获得合并单元格 CellRangeAddress ca = sheet.getMergedRegion(i); // 获得合并单元格的起始行, 结束行, 起始列, 结束列 int firstC = ca.getFirstColumn();//第一列 int lastC = ca.getLastColumn();//最后一列 int firstR = ca.getFirstRow();//第一行 int lastR = ca.getLastRow();//第二行 ExcelMergedRegionBean mb = new ExcelMergedRegionBean(); mb.setFirstRow(firstR); mb.setLastRow(lastR); mb.setFirstCell(firstC); mb.setLastCell(lastC); mergedRegionMapList.add(mb); } // 排序,便于后面循环删除 Collections.sort(mergedRegionMapList); return mergedRegionMapList; } /** * 获得单元格的值 * @param cell * @return */ public static String getCellValue(Cell cell) { String cellValue = ""; if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) cellValue = String.valueOf(cell.getNumericCellValue()); else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) cellValue = String.valueOf(cell.getBooleanCellValue()); else if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) cellValue = cell.getStringCellValue(); else if (cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA) cellValue = String.valueOf(cell.getCellFormula()); return cellValue; } } 适配器 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * 读取excel适配器 * @author Administrator * */ public class ReadExcelAdapter { private ReadExcelAdapter(){} /** * 适配方法:可读取03版本和07版本的excel * @return */ public static List<List<String>> readExcel(String filePath){ InputStream is = null; try { is = new FileInputStream(filePath); return ReadExcel03.readExcel(is); } catch (Exception e) { try { is = new FileInputStream(filePath); return ReadExcel07.readExcel(is); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e3) { e3.printStackTrace(); } } return null; } } 测试类 import java.util.List; public class ReadExcelTest { public static void main(String[] args) throws Exception { long startTime = System.currentTimeMillis(); List<List<String>> result = ReadExcelAdapter.readExcel("C:/test.xlsx"); System.out.println(result); System.out.println("use time:"+ (System.currentTimeMillis() - startTime)); } }
相关推荐
"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写Microsoft Excel OOXML格式档案...
这个“POI操作EXCEL,支持office2003,2007,2010,2013(详)”的主题涵盖了一系列知识点,旨在帮助开发者熟练地使用Apache POI处理不同版本的Excel文件。 首先,我们来看Excel的两种主要文件格式:`.xls`(Excel 97-...
Apache POI是一个流行的API,它允许程序员创建、修改和显示Microsoft Office格式的文件,其中包括Excel(.xls和.xlsx)文件。在这个场景下,我们使用的POI版本是3.17,一个稳定且广泛使用的版本。 首先,我们需要在...
然而,POI 2.5.1版本相对较老,不支持处理Excel 2007及以上版本创建的高版本Excel文件(XLSX格式),这限制了其在现代开发环境中的应用。 Apache POI是一个强大的库,不断更新以适应新的Office文件格式。为了能够...
Apache POI是一个开源项目,它提供了API来读取、写入和修改Microsoft Office格式的文件,包括Excel、Word和PowerPoint。对于Excel,Apache POI支持HSSF(处理旧的BIFF格式,即.XLS)和XSSF(处理新的XML格式,即....
Apache POI是Java语言中用于读写Microsoft Office格式文件的库,而EasyExcel是阿里巴巴开源的一款轻量级、高效的Excel处理工具,它简化了对Excel数据的读写操作。 在原版`easyExcel`的基础上,开发者进行了以下主要...
这两个库共同提供了对Excel文件的全面支持。 3. **POI-SXSSF**: SXSSF是提供内存优化的Excel处理API,特别适合处理大型工作簿,因为它可以将大部分数据写入磁盘,而不是全部保留在内存中。 4. **POI-SS**: 这是...
Apache POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF(XML Spreadsheet Format)两个组件,分别用于处理.xls(老版本Excel)和.xlsx(新版本Excel)文件。XSSF支持更丰富的功能,包括创建图表。在创建...
在Java编程中,Apache POI库是一个非常流行的API,用于读写Microsoft Office格式的文件,包括Excel。...通过理解上述概念,你可以构建或扩展自己的工具,以满足对各种Excel和WPS文件的图片提取需求。
版本3.9是POI的一个稳定版本,发布于2013年,它包含了对Office文件格式处理的多项改进和修复。 Apache POI 3.9的依赖jar包通常包括以下几个核心组件: 1. **poi-3.9.jar**:这是Apache POI的核心库,包含了处理...
综上所述,Java导入Excel文件涉及的关键技术包括Apache POI库的使用,对HSSF和XSSF的理解,以及对CSV文件处理的技巧。通过熟练掌握这些知识,你可以编写出高效且健壮的文件导入程序,满足各种需求。
1. **读取Excel**:使用Apache POI库解析Excel文件,获取标题行和数据行。 2. **验证规则**:根据数据导入规则检查Excel数据的合法性。 3. **数据转换**:将Excel数据转换为符合数据库表结构的对象。 4. **处理重复...
在这个项目中,POI可能用于处理数据导入导出,例如,从Excel文件中读取员工信息,或者将系统数据导出为Excel报告,方便数据分析和存储。 Vue.js是一个流行的前端JavaScript框架,以其简单易用、高性能和灵活的组件...
总之,"Android_POI_TO_PPT"项目旨在帮助开发者在Android应用中实现PPT文件的读取和转换,尽管目前只支持旧版PPT,但其核心思想和实现方法对处理PPTX同样具有参考价值。如果你对此感兴趣,可以通过提供邮箱或QQ联系...
在Android应用开发中,有时需要处理来自用户的Excel文件...总之,Android应用可以通过引入第三方库,如Apache POI,实现对Excel文件的读取和创建。在使用过程中,注意兼容性、性能和安全性问题,以提供良好的用户体验。
在这个案例中,我们使用的是jxl库,这是一个轻量级的库,适用于Java平台,支持读取和写入Excel 97-2003格式的文件。 2. **jxl库介绍**: - jxl库提供了一系列API,使得开发者可以方便地创建、修改和读取Excel文件...
总结来说,导入导出Excel是数据处理的重要环节,涉及到对Excel文件的操作,包括读取、写入和格式设置。选择合适的库,创建有效的模板,以及使用预先封装好的工具类,都能帮助我们高效地完成这项任务。在实际项目中,...
在描述中提到,程序可能需要自行调整才能运行,这可能是因为每个应用的环境和需求不同,可能需要对代码进行适配,例如处理不同的文件路径、文件格式或特定的数据解析逻辑。此外,“部分代码功能进行参考学习”提示...
首先,让我们了解一下Android系统对Excel文件的支持。Android本身并不直接支持读取Microsoft Excel文件,因此我们需要借助第三方库,如Apache POI。Apache POI是一个用于处理Microsoft Office格式文件的Java API,...