JavaEE POI读取 Excel中的数据,(Excel2003(xls), Excel2007(xlsx))
来源:互联网 发布:淘宝如何获取精品橱窗 编辑:程序博客网 时间:2024/04/29 19:39
项目中遇到需求:将Excel 文件中的读取出来 保存到数据库中。
这里讲解下,如何用POI 读取Excel 文件。 另:如何将数据存储到Excel 文件中:
1.将数据导出到Excel(网络下载+本地存储) http://blog.csdn.net/u010003835/article/details/50894549
2.设置单元格格式: http://blog.csdn.net/u010003835/article/details/50924454
Excel 导入, 注意 Excel 2003, Excel 2007 是不同的, 2003主要用到的类 为 HSSF 开头的类,2007 用到的类 以 XSSF 开头的类。
注意: 2007 除了基本的POI JAR包,还需要 dom4j, xmlbean 包,
这里给出这个Demo的下载地址(MyEclipse2014 下开发,喜欢的朋友在文章下面评论 或给个赞)
http://pan.baidu.com/s/1hr9qcLY
需要的Jar 包:
主要的设计思想( 程序运行的流程):
0.将 数据列(希望取得名字) 和 路径+文件名的字符串 传入方法中
1.传入文件名,根据文件名的后缀判断是Excel2003,还是Excel2007
2.读取Excel 文件,将每行的读取方式设置为abstract 抽象方法。方便对于特殊的单元格进行特殊的处理,具体的Excel特定实现
3.对于单元格的值读取 给出通用的处理方法,可以不使用这种方法,自定义处理方式
示例代码:
package util;import java.io.FileInputStream;import java.io.InputStream;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.xssf.usermodel.XSSFCell;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;/** * @author szh * @note 主要功能:导入Excel 文件中的数据 */public abstract class ExcelImportUtilVerTwo {private String[] columns;protected void setColumns(String[] columns) {this.columns = columns;}public String[] getColumns() {return this.columns;}/** * @note (Excel2003)针对于xls后缀结尾的Excel。 * 读取Excel数据行,并将数据存储到Map中,具体实现的时候指定如何读取数据行 * @param tableRow * @return 返回一行Excel的数据 * @param map */@SuppressWarnings("rawtypes")protected abstract Map readTableRowExcel2003(HSSFRow tableRow, Map map);/** * @note (Excel2007)针对于xlsx后缀结尾的Excel。 * 读取Excel数据行,并将数据存储到Map中,具体实现的时候指定如何读取数据行 * @param tableRow * @return 返回一行Excel的数据 */@SuppressWarnings("rawtypes")protected abstract Map readTableRowExcel2007(XSSFRow tableRow, Map map);/** * @param fileName * 传入文件名 * @return 根据文件名的后缀判断传入的Excel 版本 */protected String checkVersion(String fileName) {String version = "";if (null == fileName || "".equals(fileName))return version;String suffix = fileName.substring(fileName.trim().lastIndexOf(".") + 1);if ("xls".equals(suffix)) {version = "2003";} else if ("xlsx".equals(suffix)) {version = "2007";}return version;}/** * @note 读取excel, 将其中的数据以 List<Map> 的形式返回 * @param fileName * 读取的excel的文件名 */@SuppressWarnings("rawtypes")public List<Map> readExcel(String fileName, String[] columns) {List<Map> list = null;this.setColumns(columns);String version = this.checkVersion(fileName);if (!"".equals(version)) {if ("2003".equals(version)) {list = readExcel2003(fileName);} else if ("2007".equals(version)) {list = readExcel2007(fileName);}}return list;}@SuppressWarnings({ "rawtypes", "unused" })protected List<Map> readExcel2003(String fileName) {try {InputStream in = new FileInputStream(fileName);HSSFWorkbook workbook = new HSSFWorkbook(in);List<Map> list = new ArrayList<Map>();for (int i = 0; i < workbook.getNumberOfSheets(); i++) {HSSFSheet sheet = workbook.getSheetAt(i);if (null == sheet)continue;HSSFRow titleRow = sheet.getRow(0);// 从第一行开始读取,因为第0行是表头for (int j = 1; j <= sheet.getLastRowNum(); j++) {HSSFRow tableRow = sheet.getRow(j);Map map = new HashMap<>();if (null == tableRow)continue;map = this.readTableRowExcel2003(tableRow, map);list.add(map);}}in.close(); // 关闭文件return list; // 正常返回, 返回表格的数据} catch (Exception e) {e.printStackTrace();return null; // 非正常返回,返回null}}@SuppressWarnings({ "rawtypes", "unused" })protected List<Map> readExcel2007(String fileName) {try {InputStream in = new FileInputStream(fileName);XSSFWorkbook workbook = new XSSFWorkbook(in);List<Map> list = new ArrayList<Map>();for (int i = 0; i < workbook.getNumberOfSheets(); i++) {XSSFSheet sheet = workbook.getSheetAt(i);if (null == sheet)continue;XSSFRow tableTitle = sheet.getRow(0);for (int j = 1; j <= sheet.getLastRowNum(); j++) {XSSFRow tableRow = sheet.getRow(j);Map map = new HashMap();if (null == tableRow)continue;map = this.readTableRowExcel2007(tableRow, map);list.add(map);}}in.close();return list;} catch (Exception e) {e.printStackTrace();return null;}}/** * @note 将Excel(2003)中单元格的数据 转换为String返回,可以在readTableRowExcel2003中进行自定义转换方式 * @param cell * @return 若成功则返回指定的字符串,若没有成功转换则返回null */protected String getCellValueExcel2003(HSSFCell cell) {Boolean convertFlag = false;String cellValue = "";if (cell == null) {convertFlag = true;} else {switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:cellValue = cell.getStringCellValue();convertFlag = true;break;// 注意一个非常操蛋的事情,一般的 int 与 日期数据 都会被当成 CELL_TYPE_NUMERIC 类型case HSSFCell.CELL_TYPE_NUMERIC:// cellValue = String.valueOf(cell.getNumericCellValue());if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();SimpleDateFormat ymdDateConvert = new SimpleDateFormat("yyyy-MM-dd");cellValue = ymdDateConvert.format(date);} else {DecimalFormat comConvert = new DecimalFormat("#");cellValue = comConvert.format(cell.getNumericCellValue());}convertFlag = true;break;case HSSFCell.CELL_TYPE_BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());convertFlag = true;break;case HSSFCell.CELL_TYPE_BLANK:convertFlag = true;cellValue = "";break;}}if (convertFlag) {return cellValue; // 如果成功转换} else {return null;// 不成功,返回null}}/** * @note 将Excel(2007)中单元格的数据 转换为String返回 ,可以在readTableRowExcel2007中进行自定义转换方式 * @param cell * @return 若成功则返回指定的字符串,若没有成功转换则返回null, */protected String getCellValueExcel2007(XSSFCell cell) {Boolean convertFlag = false;String cellValue = "";if (cell == null) {convertFlag = true;} else {switch (cell.getCellType()) {case XSSFCell.CELL_TYPE_STRING:cellValue = cell.getStringCellValue();convertFlag = true;break;// 注意一个非常操蛋的事情,一般的 int 与 日期数据 都会被当成 CELL_TYPE_NUMERIC 类型case XSSFCell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();SimpleDateFormat ymdDateConvert = new SimpleDateFormat("yyyy-MM-dd");cellValue = ymdDateConvert.format(date);} else {DecimalFormat comConvert = new DecimalFormat("#");cellValue = comConvert.format(cell.getNumericCellValue());}convertFlag = true;break;case XSSFCell.CELL_TYPE_BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());convertFlag = true;break;case XSSFCell.CELL_TYPE_BLANK:convertFlag = true;cellValue = "";break;}}if (convertFlag) {return cellValue;} else {return null;}}}
测试代码:
package service;import java.util.List;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.xssf.usermodel.XSSFRow;import util.ExcelImportUtilVerTwo;public class ExcelImportTest {public static void main(String[] args) {ExcelImportUtilVerTwo importUtilVerTwo = new ExcelImportUtilVerTwo() {@SuppressWarnings({ "unchecked", "rawtypes" })@Overrideprotected Map readTableRowExcel2007(XSSFRow tableRow, Map map) {String[] colNames = this.getColumns();int colNum = tableRow.getPhysicalNumberOfCells();String cellValueString = null;for (int i = 0; i < colNum; i++) {cellValueString = this.getCellValueExcel2007(tableRow.getCell(i));if (cellValueString != null) {map.put(colNames[i], cellValueString);}}return map;}@SuppressWarnings({ "rawtypes", "unchecked" })@Overrideprotected Map readTableRowExcel2003(HSSFRow tableRow, Map map) {String[] colNames = this.getColumns();int colNum = tableRow.getPhysicalNumberOfCells();String cellValueString = null;for (int i = 0; i < colNum; i++) {cellValueString = this.getCellValueExcel2003(tableRow.getCell(i));if (cellValueString != null) {map.put(colNames[i], cellValueString);}}return map;// //自定义如何读取// DecimalFormat df = new DecimalFormat("#");// int colNum = tableRow.getPhysicalNumberOfCells();// String[] colNames = this.getColumns();// map.put(colNames[0],// df.format(tableRow.getCell(0).getNumericCellValue()));// map.put(colNames[1], tableRow.getCell(1));// map.put(colNames[2],// df.format(tableRow.getCell(2).getNumericCellValue()));// System.out.println(HSSFDateUtil.isCellDateFormatted(tableRow// .getCell(3)));// Date date = tableRow.getCell(3).getDateCellValue();// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// String cellvalue = sdf.format(date);// map.put(colNames[3], cellvalue);// return map;}};List<Map> list = importUtilVerTwo.readExcel("C:\\Users\\lenovo\\Downloads\\userInfo2007.xlsx",new String[] { "iphone", "name", "password", "date" });System.out.println(list);}}
1 0
- JavaEE POI读取 Excel中的数据,(Excel2003(xls), Excel2007(xlsx))
- POI解析Excel(.xls)和Excel2007(.xlsx)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取Excel(兼容Excel2003、Excel2007)
- POI读取EXCEL下xlsx,xls文件
- poi读取excel(xls,xlsx)
- POI读取Excel(兼容Excel2003、Excel2007) java读取
- POI读取XLS、XLSX
- Apache-POI读取Excel2003和Excel2007中数据。
- Java 将Excel2003(xls)/Excel2007(xlsx)转为Htm格式文件
- poi写入读取excel 2007版xlsx 97版xls
- jmx rmi 穿越防火墙问题及jmxmp的替代方案
- elasticsearch 插件
- jffs2_scan_eraseblock
- Java获取文件后缀的方式
- windows kafka
- JavaEE POI读取 Excel中的数据,(Excel2003(xls), Excel2007(xlsx))
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
- 正确使用 const,static,extern
- Linux驱动中completion接口浅析(wait_for_complete例子,很好)
- Detours实现劫持
- KafkaOffsetMonitor
- css3中动画功能
- java基础--去除List中重复的元素
- 二分查找算法变体在实际项目中的应用