1. ExcelBean.java
package com.wyy.snail.core.util; import java.util.ArrayList; import java.util.List; /** * Excel数据bean * @author penghy * @date 2014-02-24 */ public class ExcelBean<T> { private String excelName; //Excel文件名称 private String sheetName; //sheet名称 private List<Column> columns; //excel列名称 private List<T> rowDatas; //excel数据 public String getExcelName() { return excelName; } public void setExcelName(String excelName) { this.excelName = excelName; } public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public List<Column> getColumns() { if(columns == null){ columns = new ArrayList<Column>(); } return columns; } public void setColumns(List<Column> columns) { this.columns = columns; } public void addColumn(Column column){ if(columns == null){ columns = new ArrayList<Column>(); } columns.add(column); } public void addColumn(String name, String explain){ Column column = new Column(name, explain); this.addColumn(column); } public List<T> getRowDatas() { return rowDatas; } public void setRowDatas(List<T> rowDatas) { this.rowDatas = rowDatas; } } class Column{ String name; //列名称 String explain; //列对应的解释 public Column(String name, String explain) { this.name = name; this.explain = explain; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getExplain() { return explain; } public void setExplain(String explain) { this.explain = explain; } }
2. ExcelUtils.java
package com.wyy.snail.core.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; 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.ss.usermodel.WorkbookFactory; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import com.snail.base.utils.DateUtils; /** * Excel操作工具类, 需要依赖以下jar * <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.9</version> <type>jar</type> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> * @author penghy * @date 2014-02-24 */ public abstract class ExcelUtils { private static final int HEADER_DATA_INDEX = 0; private static final int ROW_DATA_INDEX = 1; private static final String DEFAULT_EXCEL_NAME = "workbook.xls"; private static final String DEFAULT_SHEET_NAME = "sheet1"; /** * 读取Excel内容,兼容excel2003,excele2007版本 * @param filePath * @return */ public static List<Map<Integer,String>> readExcel(String filePath){ FileInputStream in = null; try { in = new FileInputStream(new File(filePath)); } catch (FileNotFoundException e) { e.printStackTrace(); } Workbook wb = createWorkbook(in); return readExcel(wb); } /** * 读取Excel内容,兼容excel2003,excele2007版本 * @param in * @param isExcel2003 * @return */ public static List<Map<Integer,String>> readExcel(InputStream in){ Workbook wb = createWorkbook(in); return readExcel(wb); } /** * 读取Excel内容 * @param wb * @return */ public static List<Map<Integer,String>> readExcel(Workbook wb){ List<Map<Integer,String>> dataList = new ArrayList<Map<Integer,String>>(); Sheet sheet = wb.getSheetAt(0); int rows = sheet.getPhysicalNumberOfRows(); for(int rowIndex=0; rowIndex< rows; rowIndex++){ Row row = sheet.getRow(rowIndex); int cells = row.getPhysicalNumberOfCells(); Map<Integer,String> cellMap = new HashMap<Integer,String>(cells); for(int cellIndex=0; cellIndex<cells; cellIndex++){ Cell cell = row.getCell(cellIndex); cellMap.put(cellIndex, getStringCellValue(cell)); } dataList.add(cellMap); } return dataList; } /** * 获取单元格数据内容为字符串类型的数据 * @param cell Excel单元格 * @return String 单元格数据内容 */ private static String getStringCellValue(Cell cell) { String strCell = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); strCell = dateformat.format(dt); }else{ DecimalFormat df = new DecimalFormat("0"); strCell = df.format(cell.getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ""; break; default: strCell = ""; break; } return strCell; } /** * 创建Workbook * @param in * @param isExcel2003 * @return */ public static Workbook createWorkbook(InputStream in){ if(in == null){ throw new IllegalArgumentException("File InputStream is null, please check!"); } Workbook wb = null; try { wb = WorkbookFactory.create(in); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return wb; } /** * 创建excel * @param excelBean * @return InputStream */ public static <T> InputStream createExcel(ExcelBean<T> excelBean){ //创建excel工作簿 Workbook wb = new HSSFWorkbook(); //创建第一个sheet Sheet sheet = wb.createSheet(StringUtils.hasText(excelBean.getSheetName()) ? excelBean.getSheetName() : DEFAULT_SHEET_NAME); //设置excel header标题 setHeaderData(sheet, excelBean.getColumns()); //设置excel内容数据 setRowData(sheet, excelBean); //转化excel文件到输入流 InputStream is = null; ByteArrayOutputStream os = new ByteArrayOutputStream(); try { wb.write(os); is = new ByteArrayInputStream(os.toByteArray()); } catch (IOException e) { e.printStackTrace(); } finally{ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } return is; } /** * 创建并且下载excel * @param excelBean * @param response */ public static <T> void createAndDowloadExcel(ExcelBean<T> excelBean, HttpServletResponse response){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(createExcel(excelBean)); bos = new BufferedOutputStream(response.getOutputStream());// 取得输出流 response.reset();// 清空输出流 String filename = StringUtils.hasText(excelBean.getExcelName()) ? excelBean.getExcelName()+".xls" : DEFAULT_EXCEL_NAME; response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));// 设定输出文件头 response.setContentType("application/x-download"); byte[] buffer = new byte[8192]; int len = 0; while ((len = bis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, len); } }catch (IOException e) { e.printStackTrace(); }finally{ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 设置excel header * @param sheet * @param columns */ private static void setHeaderData(Sheet sheet, List<Column> columns){ //设置excel的header Row row = sheet.createRow(HEADER_DATA_INDEX); for(int i=0; i< columns.size(); i++){ Column column = columns.get(i); row.createCell(i).setCellValue(column.getExplain()); } } /** * 设置excel内容 * @param sheet * @param excelBean */ private static <T> void setRowData(Sheet sheet, ExcelBean<T> excelBean){ int rowIndex = ROW_DATA_INDEX; List<T> rowDatas = excelBean.getRowDatas(); for(T obj : rowDatas) { Row row = sheet.createRow(rowIndex++); //输出excel内容 List<Column> columns = excelBean.getColumns(); for(int i=0; i< columns.size(); i++) { Column column = columns.get(i); Object value = getFieldValue(column.getName(),obj); Cell cell = row.createCell(i); setCellValue(cell, value); } } } /** * 获取属性名称对应的值 * @param fieldName * @param obj * @return */ private static <T> Object getFieldValue(String fieldName, T obj){ Field field = ReflectionUtils.findField(obj.getClass(), fieldName); if(field == null){ return null; } field.setAccessible(true); return ReflectionUtils.getField(field, obj); } /** * 设置cell的内容 * @param cell * @param value */ private static void setCellValue(Cell cell, Object value){ if(value == null){ cell.setCellValue(""); return; } Class<?> cls = value.getClass(); if(cls.equals(Byte.class) || cls.equals(Short.class) || cls.equals(Integer.class) || cls.equals(Long.class) || cls.equals(Float.class) || cls.equals(Double.class)){ cell.setCellValue(Double.parseDouble(value.toString())); }else if(cls.equals(Boolean.class)){ cell.setCellValue(Boolean.parseBoolean(value.toString())); }else if(cls.equals(Date.class)){ cell.setCellValue(DateUtils.getDatetimeToString((Date)value)); }else if(cls.equals(Calendar.class)){ cell.setCellValue(DateUtils.getDatetimeToString(((Calendar)value).getTime())); }else{ cell.setCellValue(value.toString()); } } public static void main(String[] args){ //从excel读取数据 List<Map<Integer,String>> list = readExcel("d:/test.xlsx"); for(Map<Integer,String> m : list){ System.out.println(m.get(0)+" "+m.get(1)+","+m.get(2)); } } }
相关推荐
- `java的POI操作Excel文件.doc`:这可能是另一个教程,讲解如何使用POI进行Excel文件的创建、修改和保存操作。 - `poi的常用api_收藏.pdf`:这份资料可能收集了POI库中常用的API方法,并提供了一些示例代码供参考...
"poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...
### Java的POI操作Excel文件知识点详解 #### 一、POI简介与应用场景 Apache POI 是一个开源项目,由 Apache 软件基金会维护,主要用于处理 Microsoft Office 格式的文件,尤其是 Excel 和 Word 文件。POI 提供了一...
【标题】:Java的POI操作Excel文件 【描述】:在企业级开发中,有时我们需要处理Excel文件,例如根据客户需求生成报表或者读取数据。Java的POI库提供了这样的功能,它允许开发者在Java环境中操作Microsoft Office的...
5. **poi-examples**: 包含了使用Apache POI API的示例代码,可以帮助开发者理解如何实际操作Excel文件。 6. **poi-excelant**: 提供了用于构建和执行Ant任务的工具,这些任务与Excel操作有关,例如创建或处理Excel...
在Java环境中,使用POI操作Excel文件的好处在于其跨平台性和代码的可移植性。与.NET框架相比,J2EE提供了更广泛的应用场景和更好的开放性。通过POI,开发者可以在服务器端生成Excel报表,避免了在客户端处理敏感数据...
poi操作excel文件的源代码 主要包括4个函数 1、poiWrite 向excel文件写入“姓名”两个字 2、poiWriteCopy 读取一个指定文件内容,写入另一个文件; 3、poiCopy2 读取指定路径文件,指定sheet,指定行、指定单元格...
以上就是使用Apache POI进行Excel文件写操作的基本步骤。通过组合这些基本操作,你可以创建复杂的Excel文件,包括多行、多列、公式、图表等。在实际项目中,你可能还需要考虑性能优化,比如使用SXSSFWorkbook(基于...
封装POI操作Excel的过程通常包括以下几个步骤: 1. 引入依赖:在Java项目中,你需要添加Apache POI的依赖库。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.poi ...
总结起来,Apache POI为Java开发者提供了一种强大且灵活的方式来处理Excel文件,无论是通过Servlet从服务器生成文件,还是在本地通过main方法创建文件。理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java...
为了使用 POI 操作 Excel 文件,首先需要准备以下环境: 1. **JDK 版本**:至少需要 JDK 1.4 或更高版本。 2. **POI 库**:下载 POI 库,可以从 Apache 官方网站获取:...
总结来说,Apache POI为Java开发者提供了一个强大且灵活的工具,用于操作Excel文件。无论是在数据导入、数据分析,还是报表生成等场景,都能发挥其作用。通过熟练掌握POI,你可以轻松地处理各种Excel相关的任务,...