java实现对Excel的读写操作

来源:互联网 发布:刻录机软件 编辑:程序博客网 时间:2024/06/05 02:58

其实我感觉直接贴代码就好了。代码里面几乎做到每一行一个注释。应该看起来会比较简单

代码托管在github上:https://github.com/chsj1/ExcelUtils

[java] view plain copy
 print?
  1. package com.hjd.poiutils;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.OutputStream;  
  7. import java.math.BigDecimal;  
  8. import java.util.ArrayList;  
  9. import java.util.HashMap;  
  10. import java.util.Iterator;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13. import java.util.TreeMap;  
  14.   
  15. import org.apache.poi.ss.usermodel.Sheet;  
  16.   
  17. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  18. import org.apache.poi.hssf.usermodel.HSSFFont;  
  19. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  20. import org.apache.poi.hssf.util.HSSFColor;  
  21. import org.apache.poi.ss.usermodel.Cell;  
  22. import org.apache.poi.ss.usermodel.CellStyle;  
  23. import org.apache.poi.ss.usermodel.Font;  
  24. import org.apache.poi.ss.usermodel.Row;  
  25. import org.apache.poi.ss.usermodel.Workbook;  
  26. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  27.   
  28. public class ExcelUtils {  
  29.   
  30.     public static final String HEADERINFO = "headInfo";  
  31.     public static final String DATAINFON = "dataInfo";  
  32.   
  33.     /** 
  34.      *  
  35.      * @Title: getWeebWork 
  36.      * @Description: TODO(根据传入的文件名获取工作簿对象(Workbook)) 
  37.      * @param filename 
  38.      * @return 
  39.      * @throws IOException 
  40.      */  
  41.     public static Workbook getWeebWork(String filename) throws IOException {  
  42.         Workbook workbook = null;  
  43.         if (null != filename) {  
  44.             String fileType = filename.substring(filename.lastIndexOf("."),  
  45.                     filename.length());  
  46.             FileInputStream fileStream = new FileInputStream(new File(filename));  
  47.             if (".xls".equals(fileType.trim().toLowerCase())) {  
  48.                 workbook = new HSSFWorkbook(fileStream);// 创建 Excel 2003 工作簿对象  
  49.             } else if (".xlsx".equals(fileType.trim().toLowerCase())) {  
  50.                 workbook = new XSSFWorkbook(fileStream);// 创建 Excel 2007 工作簿对象  
  51.             }  
  52.         }  
  53.         return workbook;  
  54.     }  
  55.   
  56.     /** 
  57.      *  
  58.      * @Title: writeExcel 
  59.      * @Description: TODO(导出Excel表) 
  60.      * @param pathname 
  61.      *            :导出Excel表的文件路径 
  62.      * @param map 
  63.      *            :封装需要导出的数据(HEADERINFO封装表头信息,DATAINFON:封装要导出的数据信息,此处需要使用TreeMap 
  64.      *            ) 例如: map.put(ExcelUtil.HEADERINFO,List<String> headList); 
  65.      *            map.put(ExcelUtil.DATAINFON,List<TreeMap<String,Object>> 
  66.      *            dataList); 
  67.      * @param wb 
  68.      * @throws IOException 
  69.      */  
  70.     public static void writeExcel(String pathname, Map<String, Object> map,  
  71.             Workbook wb) throws IOException {  
  72.         if (null != map && null != pathname) {  
  73.             List<Object> headList = (List<Object>) map  
  74.                     .get(ExcelUtils.HEADERINFO);  
  75.             List<TreeMap<String, Object>> dataList = (List<TreeMap<String, Object>>) map  
  76.                     .get(ExcelUtils.DATAINFON);  
  77.             CellStyle style = getCellStyle(wb);  
  78.             Sheet sheet = wb.createSheet();// 在文档对象中创建一个表单..默认是表单名字是Sheet0、Sheet1....  
  79.             // Sheet sheet = wb.createSheet("hell poi");//在创建爱你表单的时候指定表单的名字  
  80.               
  81.             /** 
  82.              * 设置Excel表的第一行即表头 
  83.              */  
  84.             Row row = sheet.createRow(0);  
  85.             for (int i = 0; i < headList.size(); i++) {  
  86.                 Cell headCell = row.createCell(i);  
  87.                 headCell.setCellType(Cell.CELL_TYPE_STRING);// 设置这个单元格的数据的类型,是文本类型还是数字类型  
  88.                 headCell.setCellStyle(style);// 设置表头样式  
  89.                 headCell.setCellValue(String.valueOf(headList.get(i)));// 给这个单元格设置值  
  90.             }  
  91.   
  92.             for (int i = 0; i < dataList.size(); i++) {  
  93.                 Row rowdata = sheet.createRow(i + 1);// 创建数据行  
  94.                 TreeMap<String, Object> mapdata = dataList.get(i);  
  95.                 Iterator it = mapdata.keySet().iterator();  
  96.                 int j = 0;  
  97.                 while (it.hasNext()) {  
  98.                     String strdata = String.valueOf(mapdata.get(it.next()));  
  99.                     Cell celldata = rowdata.createCell(j);// 在一行中创建某列..  
  100.                     celldata.setCellType(Cell.CELL_TYPE_STRING);  
  101.                     celldata.setCellValue(strdata);  
  102.                     j++;  
  103.                 }  
  104.             }  
  105.   
  106.             // 文件流  
  107.             File file = new File(pathname);  
  108.             OutputStream os = new FileOutputStream(file);  
  109.             os.flush();  
  110.             wb.write(os);  
  111.             os.close();  
  112.         }  
  113.     }  
  114.   
  115.     /** 
  116.      *  
  117.      * @Title: getCellStyle 
  118.      * @Description: TODO(设置表头样式) 
  119.      * @param wb 
  120.      * @return 
  121.      */  
  122.     public static CellStyle getCellStyle(Workbook wb) {  
  123.         CellStyle style = wb.createCellStyle();  
  124.         Font font = wb.createFont();  
  125.         font.setFontName("宋体");  
  126.         font.setFontHeightInPoints((short12);// 设置字体大小  
  127.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗  
  128.         style.setFillForegroundColor(HSSFColor.LIME.index);// 设置背景色  
  129.         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
  130.         style.setAlignment(HSSFCellStyle.SOLID_FOREGROUND);// 让单元格居中  
  131.         // style.setWrapText(true);//设置自动换行  
  132.         style.setFont(font);  
  133.         return style;  
  134.     }  
  135.   
  136.     /** 
  137.      *  
  138.      * @Title: readerExcelDemo 
  139.      * @Description: TODO(读取Excel表中的数据) 
  140.      * @throws IOException 
  141.      */  
  142.     public static void readFromExcelDemo() throws IOException {  
  143.         /** 
  144.          * 读取Excel表中的所有数据 
  145.          */  
  146.         Workbook workbook = getWeebWork("E:/test.xlsx");  
  147.         System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数  
  148.         Sheet sheet = workbook.getSheetAt(0);  
  149.         // Sheet sheet = workbook.getSheetAt(1);  
  150.         int rownum = sheet.getLastRowNum();// 获取总行数  
  151.         for (int i = 0; i <= rownum; i++) {  
  152.             Row row = sheet.getRow(i);  
  153.             Cell orderno = row.getCell(2);// 获取指定单元格中的数据  
  154.             // System.out.println(orderno.getCellType());//这个打印的是cell的type  
  155.             short cellnum = row.getLastCellNum(); // 获取单元格的总列数  
  156.             for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {  
  157.                 Cell celldata = row.getCell(j);  
  158.                 System.out.print(celldata + "\t");  
  159.             }  
  160.             System.out.println();  
  161.         }  
  162.   
  163.         /** 
  164.          * 读取指定位置的单元格 
  165.          */  
  166.         // Row row1 = sheet.getRow(1);  
  167.         // Cell cell1 = row1.getCell(2);  
  168.         // System.out.print("(1,2)位置单元格的值为:"+cell1);  
  169.         // BigDecimal big = new  
  170.         // BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型  
  171.         // System.out.print("\t"+String.valueOf(big));  
  172.   
  173.     }  
  174.   
  175.     public static void readFromExcelDemo1() throws IOException {  
  176.         /** 
  177.          * 读取Excel表中的所有数据 
  178.          *  
  179.          * Workbook: excel的文档对象 sheet: excel的表单 row: excel中的行 cell: excel中的单元格子 
  180.          *  
  181.          */  
  182.         Workbook workbook = getWeebWork("E:/test.xlsx");  
  183.         System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数  
  184.         // Sheet sheet =workbook.getSheetAt(0);  
  185.         Sheet sheet = workbook.getSheetAt(2);// 获取第二个表单  
  186.         int rownum = sheet.getLastRowNum();// 获取总行数  
  187.         for (int i = 0; i <= rownum; i++) {  
  188.             Row row = sheet.getRow(i);// 获取表达的第i行  
  189.             // Cell orderno =  
  190.             // row.getCell(2);//获取指定单元格中的数据(获取一行中的第2列(这里的2指的是0,1,2.排在第三位))  
  191.             // System.out.println(orderno.getCellType());//这个打印的是cell的type  
  192.             // short cellnum=row.getLastCellNum();  
  193.             // //获取单元格的总列数(获取一行中有多少个单元格(也就是多少列))  
  194.   
  195.             /** 
  196.              * row.getFirstCellNum(): 获取行的第一个单元格的位置 row.getLastCellNum(): 
  197.              * 获取行的最后一个单元格的位置 
  198.              */  
  199.             for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {// 遍历一行中的所有列  
  200.                 Cell celldata = row.getCell(j);// 获取一行中的第j列返回Cell类型的数据  
  201.                 System.out.print(celldata + "\t");//  
  202.             }  
  203.   
  204.             // 打印指定列  
  205.             // Cell celldata = row.getCell(4);//获取这一行中的第4列(在第5个位置上)  
  206.             // System.out.print( "\"" + celldata+"\",");  
  207.   
  208.             System.out.println();  
  209.         }  
  210.   
  211.         /** 
  212.          * 读取指定位置的单元格 
  213.          */  
  214.         // Row row1 = sheet.getRow(1);  
  215.         // Cell cell1 = row1.getCell(2);  
  216.         // System.out.print("(1,2)位置单元格的值为:"+cell1);  
  217.         // BigDecimal big = new  
  218.         // BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型  
  219.         // System.out.print("\t"+String.valueOf(big));  
  220.   
  221.     }  
  222.   
  223.       
  224.     public static void readFromExcelDemo(String fileAbsolutePath) throws IOException {  
  225.         /** 
  226.          * 读取Excel表中的所有数据 
  227.          */  
  228.         Workbook workbook = getWeebWork(fileAbsolutePath);  
  229.         System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数  
  230.         Sheet sheet = workbook.getSheetAt(0);  
  231.         // Sheet sheet = workbook.getSheetAt(1);  
  232.         int rownum = sheet.getLastRowNum();// 获取总行数  
  233.         for (int i = 0; i <= rownum; i++) {  
  234.             Row row = sheet.getRow(i);  
  235.             Cell orderno = row.getCell(2);// 获取指定单元格中的数据  
  236.             // System.out.println(orderno.getCellType());//这个打印的是cell的type  
  237.             short cellnum = row.getLastCellNum(); // 获取单元格的总列数  
  238.             for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {  
  239.                 Cell celldata = row.getCell(j);  
  240.                 System.out.print(celldata + "\t");  
  241.             }  
  242.             System.out.println();  
  243.         }  
  244.   
  245.         /** 
  246.          * 读取指定位置的单元格 
  247.          */  
  248.         // Row row1 = sheet.getRow(1);  
  249.         // Cell cell1 = row1.getCell(2);  
  250.         // System.out.print("(1,2)位置单元格的值为:"+cell1);  
  251.         // BigDecimal big = new  
  252.         // BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型  
  253.         // System.out.print("\t"+String.valueOf(big));  
  254.   
  255.     }  
  256.       
  257.       
  258.     public static void main(String[] args) throws IOException {  
  259. //       readFromExcelDemo1();  
  260.   
  261. //      String filePath = "E:/test.xlsx";  
  262. //      readFromExcelDemo(filePath);//从一个指定的excel文件中读取内容  
  263.           
  264.           
  265. //      writeToExcelDemo();  
  266.     }  
  267.       
  268.       
  269.   
  270.     public static void writeToExcelDemo() throws IOException {  
  271.         /** 
  272.          * HSSF: .xls XSSF: .xlsx 所以大家会在官网中看到Excel = HSSF+XSSF 
  273.          *  
  274.          * HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 XSSF是POI工程对Excel 2007 OOXML 
  275.          * (.xlsx)文件操作的纯Java实现 
  276.          *  
  277.          * 从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF 
  278.          *  
  279.          */  
  280.   
  281.         Workbook wb = new XSSFWorkbook();// 创建一个新的excel的文档对象  
  282.         Map<String, Object> map = new HashMap<String, Object>();  
  283.         List headList = new ArrayList();// 表头数据  
  284.         headList.add("下单时间");  
  285.         headList.add("结账时间");  
  286.         headList.add("订单编号");  
  287.         headList.add("订单金额");  
  288.         headList.add("用户名");// excel的都  
  289.   
  290.         /** 
  291.          * TreeMap基于红黑树实现 
  292.          */  
  293.         List dataList = new ArrayList();// 表格内的数据  
  294.         for (int i = 0; i < 15; i++) {  
  295.             TreeMap<String, Object> treeMap = new TreeMap<String, Object>();// 此处的数据必须为有序数据,所以使用TreeMap进行封装  
  296.             treeMap.put("m1""2013-10-" + i + 1);  
  297.             treeMap.put("m2""2013-11-" + i + 1);  
  298.             treeMap.put("m3""20124" + i + 1);  
  299.             treeMap.put("m4"23.5 + i + 1);  
  300.             treeMap.put("m5""张三_" + i);  
  301.             dataList.add(treeMap);  
  302.         }  
  303.   
  304.         /* 
  305.          * 先不要加上以下这一段,否则以下错误: Cannot get a numeric value from a text 
  306.          * cell(不能从一个text cell中获取数字类型的数据) 
  307.          *  
  308.          * 解决办法: http://blog.csdn.net/ysughw/article/details/9288307 
  309.          */  
  310.         // TreeMap<String,Object> treeMap1 = new TreeMap<String, Object>();  
  311.         // treeMap1.put("asd", null);  
  312.         // treeMap1.put("猪头", "zhutou");  
  313.         // dataList.add(treeMap1);  
  314.         map.put(ExcelUtils.HEADERINFO, headList);  
  315.         map.put(ExcelUtils.DATAINFON, dataList);  
  316.         writeExcel("E:/test1.xlsx", map, wb);//往wb里面写map中内容,生成E:/test1.xlsx这个文件....  
  317.     }  
  318. }  
原创粉丝点击