- 浏览: 468404 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
package ycl.learn.excel; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ExcelResult { public static final String HEADER_KEY = "header"; private static final String DEFUAL_KEY = "defalut"; private ArrayList<ExcelErrorEnum> errors = new ArrayList<ExcelErrorEnum>(); private Map<String, Object> contentMap = new HashMap<String,Object>(); public enum ExcelErrorEnum{ FILE_FORMAT,WORKBOOK_NOT_EXIST,SHEET_NOT_DATA,HEADER_LENGTH_NOT_MATCH,HEADER_NOT_MATCH,CELL_NOT_EXIST; } /** * The error exist. * * @return */ public boolean errorsExist() { if ( errors.size() > 0 ) { return true; } else { return false; } } /** * add errorCode * * @param errorCode */ public void addError( ExcelErrorEnum errorCode ) { errors.add(errorCode); } /** * add all sub errorCodes * * @param excelError */ public void addErrors(ExcelResult excelError){ errors.addAll(excelError.errors); } public ArrayList<ExcelErrorEnum> getErrors(){ return errors; } public void setContent(Object obj){ contentMap.put(DEFUAL_KEY, obj); } public Object getContent(){ return contentMap.get(DEFUAL_KEY); } public void setContent(String key,Object obj){ contentMap.put(key, obj); } public Object getContent(String key){ return contentMap.get(key); } public Map<String,Object> getContentMap(){ return contentMap; } }
this is the definetion of ExcelResult, contain the error and result.
package ycl.learn.excel; public class ExcelHeader { public interface ColumnHeader{ public String getName(); } public enum UserHeader implements ColumnHeader{ ACTION("ACTION"),FIRST_NAME("FIRST NAME"),LAST_NAME("LAST NAME"),E_MAIL("E-MAIL"),PHONE("PHONE"); private String name=null; private UserHeader(String name){ this.name = name; } public String getName(){ return name; } } public enum PhoneHeader implements ColumnHeader{ //ACTION("ACTION"), NAME("NAME"),PHONE_NUMBER("PHONE NUMBER"); private String name=null; private PhoneHeader(String name){ this.name = name; } public String getName(){ return name; } } }
this is the ExcelHeader definetion, You can choose some of columns you wanted to export.
package ycl.learn.excel; import java.io.InputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; 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.usermodel.XSSFWorkbook; import ycl.learn.excel.ExcelResult.ExcelErrorEnum; import ycl.learn.excel.ExcelHeader.ColumnHeader; public class ExcelReader { public static ExcelResult readExcelFile(InputStream inputStream, String fileName, ColumnHeader[] chs) { ExcelResult result = new ExcelResult(); String ext = fileName.substring(fileName.lastIndexOf(".") + 1); boolean version2007 = false; if ("xlsx".equals(ext.toLowerCase())) { version2007 = true; } Workbook workbook = null; try { if (version2007) workbook = new XSSFWorkbook(inputStream); else workbook = new HSSFWorkbook(inputStream); } catch (Exception e) { result.addError(ExcelErrorEnum.FILE_FORMAT); return result; } result = parseWorkBook(workbook, chs); return result; } private static ExcelResult parseWorkBook(Workbook workbook, ColumnHeader[] chs) { ExcelResult reulst = new ExcelResult(); if (workbook == null) { reulst.addError(ExcelErrorEnum.WORKBOOK_NOT_EXIST); } for (int num = 0; num < workbook.getNumberOfSheets(); num++) { Sheet sheet = workbook.getSheetAt(num); String sheetName = sheet.getSheetName(); if (sheet != null) { ExcelResult sheetResult = parseSheet(sheet, chs); if(sheetResult.getErrors().contains(ExcelErrorEnum.SHEET_NOT_DATA)){ continue; } reulst.addErrors(sheetResult); reulst.setContent(sheetName, sheetResult); } } return reulst; } @SuppressWarnings("unchecked") private static ExcelResult parseSheet(Sheet sheet, ColumnHeader[] chs) { ExcelResult result = new ExcelResult(); Map<String, Integer> allMap = new HashMap<String, Integer>(); Map<String, Integer> headerMap = new HashMap<String, Integer>(); List<Map<String, String>> dataListMap = new ArrayList<Map<String, String>>(); int rows = sheet.getLastRowNum(); if (rows < 1) { result.addError(ExcelErrorEnum.SHEET_NOT_DATA); return result; } Row headerRow = sheet.getRow(0); if (headerRow == null || headerRow.getLastCellNum() < chs.length) { result.addError(ExcelErrorEnum.HEADER_LENGTH_NOT_MATCH); return result; } for (int i = 0; i < headerRow.getLastCellNum(); i++) { Cell headerCell = headerRow.getCell(i); String header = getStringCellValue(headerCell); allMap.put(header.toUpperCase(), i); } for (ColumnHeader ch : chs) { Integer index = allMap.get(ch.getName().toUpperCase()); if (index == null) { result.addError(ExcelErrorEnum.HEADER_NOT_MATCH); return result; }else{ headerMap.put(ch.getName().toUpperCase(), index); } } for (int r = 1; r <= rows; r++) { Row row = sheet.getRow(r); ExcelResult rowReult = parseRow(headerMap, row, chs); result.addErrors(rowReult); Map<String, String> rowValues = (Map<String, String>) rowReult .getContent(); dataListMap.add(rowValues); } result.setContent(ExcelResult.HEADER_KEY, headerMap); result.setContent(dataListMap); return result; } private static ExcelResult parseRow(Map<String, Integer> headerMap, Row row, ColumnHeader[] chs) { ExcelResult result = new ExcelResult(); Map<String, String> rowValues = new HashMap<String, String>(); for (ColumnHeader ch : chs) { Integer index = headerMap.get(ch.getName()); Cell cell = row.getCell(index); if (cell != null) { rowValues.put(ch.getName(), getStringCellValue(cell)); }else{ result.addError(ExcelErrorEnum.CELL_NOT_EXIST); return result; } } result.setContent(rowValues); return result; } /** * be able to read as string value from a non-string type cell. * Every cell value transform to string format. * * @param cell * @return */ private static String getStringCellValue(Cell cell) { if (cell == null) { return ""; } else { Object ret = null; switch (cell.getCellType()) { case Cell.CELL_TYPE_FORMULA://formula switch (cell.getCachedFormulaResultType()) { case Cell.CELL_TYPE_STRING: ret = cell.getStringCellValue(); break; case Cell.CELL_TYPE_NUMERIC: ret = new Double(cell.getNumericCellValue()); break; default: ret = cell.getStringCellValue(); } break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { ret = cell.getDateCellValue(); } else { ret = new Double(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_STRING: ret = cell.getStringCellValue(); break; case Cell.CELL_TYPE_BLANK:// blank ret = ""; break; case Cell.CELL_TYPE_ERROR: ret = ""; break; case Cell.CELL_TYPE_BOOLEAN: ret = new Boolean(cell.getBooleanCellValue()); break; default: try { ret = cell.getStringCellValue(); } catch (Exception e) { ret = ""; } } return ret.toString().trim(); } } }
this is the read process. not expanded, but you can ,just read the first line as header, via you designed Columnheader to read xls. and return as the definetion as ExcelResult.
package ycl.learn.excel; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; import java.util.Map; import ycl.learn.excel.ExcelHeader.ColumnHeader; import ycl.learn.excel.ExcelHeader.UserHeader; public class TestExcelReader { private static final String UPLOAD_FILE = "C:\\Documents and Settings\\e557400\\workspace\\YclPlmTest\\UserHeader.xls"; private static final String UPLOAD_PHONE_FILE = "C:\\Documents and Settings\\e557400\\workspace\\YclPlmTest\\PhoneHeader.xls"; private static final String UPLOAD_PHONE_FILE_2007 = "C:\\Documents and Settings\\e557400\\workspace\\YclPlmTest\\PhoneHeader2007.xlsx"; private static final String FILE_NAME="UserHeader.xls"; private static final String FILE_NAME_PHONE="PhoneHeader.xls"; private static final String FILE_NAME_PHONE_2007="PhoneHeader2007.xlsx"; public static void main(String args[]) throws FileNotFoundException{ //testUserHeader(); testPhoneHeader(); } public static void testUserHeader() throws FileNotFoundException{ InputStream is = new FileInputStream(UPLOAD_FILE); ExcelReader reader = new ExcelReader(); ColumnHeader[] ch = ExcelHeader.UserHeader.values(); ExcelResult result = reader.readExcelFile(is,FILE_NAME,ch); if(result.errorsExist()){ System.out.println(result.getErrors()); return; } for(Map.Entry<String, Object> entry :result.getContentMap().entrySet()){ String sheetName = entry.getKey(); System.out.println("sheet:"+sheetName); ExcelResult sheetResult = (ExcelResult) entry.getValue(); Map<String, Integer> headerMap = (Map<String, Integer>) sheetResult.getContent(ExcelResult.HEADER_KEY); for(Map.Entry<String, Integer> headerentry :headerMap.entrySet()){ System.out.print(headerentry.getKey()+"||"); } System.out.println(); List<Map<String, String>> dataListMap = (List<Map<String, String>>) sheetResult.getContent(); for(Map<String, String> dataMap:dataListMap){ for(Map.Entry<String, String> dataerentry :dataMap.entrySet()){ System.out.print(dataerentry.getValue()+"||"); } System.out.println(); } } } /** * you successed that just modify the header, you can match any other xls. * you successed that just get some columns in xls, not all * you successed that get 1997-2007 's xls reader. * @throws FileNotFoundException */ public static void testPhoneHeader() throws FileNotFoundException{ InputStream is = new FileInputStream(UPLOAD_PHONE_FILE_2007); ExcelReader reader = new ExcelReader(); ColumnHeader[] ch = ExcelHeader.PhoneHeader.values(); ExcelResult result = reader.readExcelFile(is,FILE_NAME_PHONE_2007,ch); if(result.errorsExist()){ System.out.println(result.getErrors()); return; } for(Map.Entry<String, Object> entry :result.getContentMap().entrySet()){ String sheetName = entry.getKey(); System.out.println("sheet:"+sheetName); ExcelResult sheetResult = (ExcelResult) entry.getValue(); Map<String, Integer> headerMap = (Map<String, Integer>) sheetResult.getContent(ExcelResult.HEADER_KEY); for(Map.Entry<String, Integer> headerentry :headerMap.entrySet()){ System.out.print(headerentry.getKey()+"||"); } System.out.println(); List<Map<String, String>> dataListMap = (List<Map<String, String>>) sheetResult.getContent(); for(Map<String, String> dataMap:dataListMap){ for(Map.Entry<String, String> dataerentry :dataMap.entrySet()){ System.out.print(dataerentry.getValue()+"||"); } System.out.println(); } } } }
this is the testCase. just modified the xls file and column definetion, can read with different format xls.
相关推荐
在本文中,我们将深入探讨如何使用Apache POI库来兼容读取Excel2003(.xls)和Excel2007及以上版本(.xlsx)的文件。 首先,Apache POI提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet Format)...
这篇博客“通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)”正是介绍了如何使用Apache POI库来处理不同版本的Excel文件。 Apache POI 提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet ...
在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...
在这个"poi读取excel2007和2003兼容工具例子"中,我们将探讨如何使用POI来读取不同版本的Excel文件,特别是Excel 2003(.xls)和Excel 2007及更高版本(.xlsx)。 1. **Apache POI库**:Apache POI是Apache软件基金...
标题提到的"poi读取excel文件",指的是使用Apache POI库来处理Excel数据。在最新的版本中,POI引入了更高效和强大的功能,使得处理Excel文件变得更加方便。 描述中提到了"最新版poi相关的6个jar包",这些jar包是...
在Android平台上,使用Apache POI库来读取Excel文件是一种常见的解决方案。Apache POI是一个流行的开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在这个“android ...
读取Excel文件使用HSSF的usermodel API非常直观。首先,你需要创建一个`InputStream`,然后实例化`HSSFWorkbook`: ```java InputStream myxls = new FileInputStream("workbook.xls"); HSSFWorkbook wb = new ...
以下是使用ExcelUtil读取Excel的基本步骤: 1. 引入Apache POI和ExcelUtil库:在项目中添加Apache POI和ExcelUtil的依赖,确保能够调用相关API。 2. 创建Java对象:根据Excel表格的结构,创建对应的Java Bean类。...
"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...
以下是关于"poi java读取excel所需jar包"的详细知识讲解。 1. **Apache POI 主要jar包**: - `poi-3.7-sources.jar`:这是Apache POI的主要源代码包,虽然在运行时并不需要源代码,但如果你需要查看或调试POI的...
在给定的标题和描述中,"jsp+jspsmart上传+poi3.8读取excel2007+jxl读取excel2003" 提到了一种结合Java Web技术实现文件上传,并通过不同库解析Excel文件的解决方案。这里我们将详细探讨涉及的各个知识点。 首先,`...
标题中的"poi读取excel的jar包"指的是Apache POI库的一个版本,它包含了读取Excel 2007文件所需的类和方法。在Java程序中,引入这个jar包后,开发者可以编写代码来处理.xlsx文件,无论是读取数据、解析工作表还是...
- POI 不支持读取 .xls 文件(Excel 97-2003 格式),除非使用 HSSFWorkbook 类,但不推荐,因为 .xlsx 格式更现代且兼容性更好。 - 处理大型文件时,要特别注意内存管理,避免因数据量过大导致 OutOfMemoryError...
3. **读取Excel文件**: 使用POI,你可以通过WorkbookFactory.create()方法打开Excel文件。然后,你可以遍历工作簿中的每个工作表,进一步遍历每个工作表中的行和单元格,获取或处理数据。 4. **写入Excel文件**: ...
1. **读取Excel文件**: 使用HSSFWorkbook对象来读取.xls文件,XSSFWorkbook对象用于.xlsx文件。首先,你需要打开工作簿,然后获取其中的工作表,接着可以遍历行和单元格,提取数据。例如: ```java ...
它也提供了创建、修改和读取Excel文件的功能,但因为OpenXML格式基于XML,所以XSSF的内存消耗通常比HSSF高。 **3. 创建Excel文件** 使用POI创建Excel文件时,首先需要创建`Workbook`对象。对于Excel 2003,使用`...
### Java读取Excel POI方法详解 #### 一、POI简介及背景 Apache POI 是一个用于处理 Microsoft Office 格式文件的开源库,它提供了读取、写入和修改这些文件的功能。POI 项目中最常用的部分是 HSSF 和 XSSF,分别...
Java POI 是一个开源库,...因此,为了确保Java POI能够顺利读取Excel文件,开发者必须确保项目配置中包含了上述所有必要的库文件。同时,根据项目需求,可能还需要更新到最新版本的POI库,以获得更好的性能和兼容性。
使用Jxl读取Excel文件的基本步骤如下: 1. 引入Jxl库:在项目中添加jxl.jar依赖。 2. 创建Workbook对象:使用`Workbook.getWorkbook(FileInputStream)`方法打开Excel文件。 3. 获取Sheet对象:通过Workbook对象的`...
- Java:使用Apache POI库读取Excel,JDBC连接数据库。 考虑到“update material shortage”这一标签,可能涉及的是库存管理系统的数据同步。在实际应用中,可能需要关注库存物料的短缺情况,通过定时读取Excel更新...