原文转载:http://blog.csdn.net/sidongxue2/article/details/38423135
Jakarta POI是apache的子项目,它提供了一组操纵Windows文档的Java API,通过它可以用纯Java代码来读取,写入和修改Excel文件.
本实例将excel内容抽象为一个Map<String, Map<String, List<String>>>,第一个key为sheet的名称,第二个key为行号.
1.实现将map写入excel,直接看代码ExcelExprotUtil.
- package com.ilucky.poi.util;
- import java.io.BufferedOutputStream;
- import java.io.FileOutputStream;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRichTextString;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- /**
- * @author IluckySi
- * @date 20140807
- */
- public class ExcelExportUtil {
- private String path;
- private String name;
- private Map<String, Map<String, List<String>>> excel;
- public ExcelExportUtil(Map<String, Map<String, List<String>>> excel) {
- this.excel = excel;
- }
- public String getPath() {
- return path;
- }
- public void setPath(String path) {
- this.path = path;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void exportExcel() {
- FileOutputStream fos = null;
- BufferedOutputStream bos = null;
- try {
- //校验数据源是否合法.
- if(excel.size() <= 0) {
- try {
- throw new Exception("excel数据源有问题!");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //创建excel.
- HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
- int sheetCount = 0;
- for(Entry<String, Map<String, List<String>>> sheet : excel.entrySet()) {
- //创建sheet并命名.
- String sheetName = sheet.getKey();
- HSSFSheet hssfSheet = hssfWorkbook.createSheet();
- hssfWorkbook.setSheetName(sheetCount, sheetName);
- Map<String, List<String>> sheetValue = sheet.getValue();
- for(Entry<String, List<String>> row : sheetValue.entrySet()) {
- //创建行.
- int rowNumber = Integer.parseInt(row.getKey());
- HSSFRow hssfRow = hssfSheet.createRow(rowNumber);
- List<String> rowValue = row.getValue();
- for(int i = 0; rowValue != null && i < rowValue.size(); i++) {
- //创建单元格并写入内容.
- String cellValue = rowValue.get(i);
- HSSFCell hssfCell = hssfRow.createCell((short)i);
- hssfCell.setCellValue(new HSSFRichTextString(cellValue));
- }
- }
- sheetCount++;
- }
- //导出为excel.
- fos = new FileOutputStream(path + "/" + name);
- bos = new BufferedOutputStream(fos);
- hssfWorkbook.write(bos);
- } catch (Exception e) {
- System.out.println("导出excel发生问题: " + e);
- } finally {
- try {
- if(bos != null) {
- bos.close();
- bos = null;
- }
- if(fos != null) {
- fos.close();
- fos = null;
- }
- } catch (Exception e) {
- System.out.println("关闭文件流发生问题: " + e);
- }
- }
- }
- }
2.实现将excel中的内容放入map,直接看代码ExcelImportUtil.
- package com.ilucky.poi.util;
- import java.io.FileInputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.poifs.filesystem.POIFSFileSystem;
- /**
- * @author IluckySi
- * @date 20140807
- */
- public class ExcelImportUtil {
- private String path;
- private String name;
- private Map<String, Map<String, List<String>>> excel;
- public ExcelImportUtil() {
- excel = new HashMap<String, Map<String, List<String>>>();
- }
- public String getPath() {
- return path;
- }
- public void setPath(String path) {
- this.path = path;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Map<String, Map<String, List<String>>> importExcel () {
- //创建一个map存放excel中的数据.
- FileInputStream fis = null;
- try {
- //加载要读取的excel文件.
- fis = new FileInputStream(path + "/" + name);
- POIFSFileSystem pfs = new POIFSFileSystem(fis);
- HSSFWorkbook hssfWorkbook = new HSSFWorkbook(pfs);
- int sheetCount = getSheetCount(hssfWorkbook);
- for(int i = 0; i < sheetCount; i++) {
- //获取sheet.
- Map<String, List<String>> sheet = new HashMap<String, List<String>>();
- String sheetName = hssfWorkbook.getSheetName(i);
- HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(i);
- @SuppressWarnings("unchecked")
- Iterator<HSSFRow>rowIteraotr = hssfSheet.rowIterator();
- //获取行.
- int rowNumber = 0;
- while(rowIteraotr.hasNext()) {
- List<String> rowList = new ArrayList<String>();
- HSSFRow hssfRow = rowIteraotr.next();
- @SuppressWarnings("unchecked")
- Iterator<HSSFCell> cellIterator = hssfRow.cellIterator();
- while(cellIterator.hasNext()) {
- //获取单元格内数据.
- HSSFCell hssfCell = cellIterator.next();
- String cellValue =hssfCell.getRichStringCellValue().toString();
- rowList.add(cellValue);
- }
- sheet.put(rowNumber + "", rowList);
- rowNumber++;
- }
- excel.put(sheetName, sheet);
- }
- } catch (Exception e) {
- System.out.println("获取excel数据发生问题: " + e);
- } finally {
- try {
- if(fis != null) {
- fis.close();
- fis = null;
- }
- } catch (Exception e) {
- System.out.println("关闭文件流发生问题: " + e);
- }
- }
- return excel;
- }
- @SuppressWarnings("unused")
- public static int getSheetCount(HSSFWorkbook hssfWorkbook) {
- int count = 0;
- try {
- for(int i = 0; i < 255; i++) {
- count = i;
- HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(i);
- }
- } catch (Exception e) {
- return count;
- } finally {
- System.out.println("此excel共有" + count + "个sheet!");
- }
- return count;
- }
- }
3.最后看测试类MainTest.
- package com.ilucky.poi;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import com.ilucky.poi.util.ExcelExportUtil;
- import com.ilucky.poi.util.ExcelImportUtil;
- /**
- * @author IluckySi
- * @date 20140807
- */
- public class MainTest {
- public static void main(String[] args) {
- //写入excel数据.
- exportExcel();
- //读取excel数据.
- importExcel();
- }
- public static void exportExcel() {
- //创建一个map模拟excel中的数据.
- Map<String, Map<String, List<String>>> excel = new HashMap<String, Map<String, List<String>>>();
- //创建一个map模拟第一个sheet中的数据.
- Map<String, List<String>> sheet1 = new HashMap<String, List<String>>();
- //创建一个list模拟第一行的数据.
- List<String> sheet1_row1 = new ArrayList<String>();
- sheet1_row1.add("姓名");
- sheet1_row1.add("年龄");
- sheet1_row1.add("学历");
- sheet1.put("0", sheet1_row1);
- //创建一个list模拟第二行的数据.
- List<String> sheet1_row2 = new ArrayList<String>();
- sheet1_row2.add("司冬雪");
- sheet1_row2.add("26");
- sheet1_row2.add("大专");
- sheet1.put("1", sheet1_row2);
- //创建一个list模拟第三行的数据.
- List<String> sheet1_row3 = new ArrayList<String>();
- sheet1_row3.add("爱谁谁");
- sheet1_row3.add("26");
- sheet1_row3.add("本科");
- sheet1.put("2", sheet1_row3);
- excel.put("sheet_name1", sheet1);
- //创建一个map模拟第一个sheet中的数据.
- Map<String, List<String>> sheet2 = new HashMap<String, List<String>>();
- //创建一个list模拟第一行的数据.
- List<String> sheet2_row1 = new ArrayList<String>();
- sheet2_row1.add("演员");
- sheet2_row1.add("职业");
- sheet2_row1.add("年龄");
- sheet2.put("0", sheet2_row1);
- //创建一个list模拟第二行的数据.
- List<String> sheet2_row2 = new ArrayList<String>();
- sheet2_row2.add("郭德纲");
- sheet2_row2.add("相声演员");
- sheet2_row2.add("40");
- sheet2.put("1", sheet2_row2);
- //创建一个list模拟第三行的数据.
- List<String> sheet2_row3 = new ArrayList<String>();
- sheet2_row3.add("赵本山");
- sheet2_row3.add("小品演员");
- sheet2_row3.add("55");
- sheet2.put("2", sheet2_row3);
- excel.put("sheet_name2", sheet2);
- //将数据源写入excel.
- ExcelExportUtil eeu = new ExcelExportUtil(excel);
- eeu.setPath("D:/");
- eeu.setName("excel_exprot.xls");
- eeu.exportExcel();
- }
- public static void importExcel() {
- //创建一个map存放excel中的数据.
- Map<String, Map<String, List<String>>> excel = new HashMap<String, Map<String, List<String>>>();
- //读取excel数据.
- ExcelImportUtil eiu = new ExcelImportUtil();
- eiu.setPath("D:/");
- eiu.setName("excel_exprot.xls");
- excel = eiu.importExcel();
- //遍历获取的excel数据.
- for(Entry<String, Map<String, List<String>>> map : excel.entrySet()) {
- String sheetKey = map.getKey();
- System.out.println("sheet_name: " + sheetKey);
- Map<String, List<String>> sheetValue = map.getValue();
- for(Entry<String, List<String>> row : sheetValue.entrySet()) {
- String rowNumber = row.getKey();
- System.out.println("第" + rowNumber + "行数据: ");
- List<String> rowValue = row.getValue();
- for(int i = 0; rowValue != null && i < rowValue.size(); i++) {
- String cellValue = rowValue.get(i);
- System.out.println("第" + i + "个单元格的数据: " + cellValue);
- }
- }
- }
- }
- }
- /**
- excel共有2个sheet!
- sheet_name: sheet_name1
- 第2行数据:
- 第0个单元格的数据: 爱谁谁
- 第1个单元格的数据: 26
- 第2个单元格的数据: 本科
- 第1行数据:
- 第0个单元格的数据: 司冬雪
- 第1个单元格的数据: 26
- 第2个单元格的数据: 大专
- 第0行数据:
- 第0个单元格的数据: 姓名
- 第1个单元格的数据: 年龄
- 第2个单元格的数据: 学历
- sheet_name: sheet_name2
- 第2行数据:
- 第0个单元格的数据: 赵本山
- 第1个单元格的数据: 小品演员
- 第2个单元格的数据: 55
- 第1行数据:
- 第0个单元格的数据: 郭德纲
- 第1个单元格的数据: 相声演员
- 第2个单元格的数据: 40
- 第0行数据:
- 第0个单元格的数据: 演员
- 第1个单元格的数据: 职业
- 第2个单元格的数据: 年龄
- */
原文转载:http://blog.csdn.net/sidongxue2/article/details/38423135