[Java] Java读写Excel辅助类 ExcelUtil.java

[复制链接]

69

主题

71

帖子

587

积分

钻石

Rank: 4

积分
587
784 0 study 发表于 2016-12-30 00:17:22
ExcelUtil.java:
  1. package pers.kangxu.datautils.utils;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;

  12. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  13. import org.apache.poi.hssf.usermodel.HSSFFont;
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15. import org.apache.poi.ss.usermodel.Cell;
  16. import org.apache.poi.ss.usermodel.CellStyle;
  17. import org.apache.poi.ss.usermodel.CellValue;
  18. import org.apache.poi.ss.usermodel.Font;
  19. import org.apache.poi.ss.usermodel.FormulaEvaluator;
  20. import org.apache.poi.ss.usermodel.Row;
  21. import org.apache.poi.ss.usermodel.Sheet;
  22. import org.apache.poi.ss.usermodel.Workbook;
  23. import org.apache.poi.ss.util.CellRangeAddress;

  24. /**
  25. *
  26. * <b>
  27. *    excel 工具
  28. * </b>
  29. * @author kangxu
  30. *
  31. */
  32. public class ExcelUtil {
  33.    
  34.     /**
  35.      * 导出 excel
  36.      * @param filePath  文件全路径
  37.      * @param sheetName  sheet页名称
  38.      * @param sheetIndex 当前sheet下表  从0开始
  39.      * @param fileHeader 头部
  40.      * @param datas 内容
  41.      */
  42.     public static void writeExcel(String filePath,String sheetName,
  43.                                     int sheetIndex,
  44.                                     String[] fileHeader,
  45.                                     List<String[]> datas){
  46.         // 创建工作簿
  47.         Workbook wb = new HSSFWorkbook();
  48.         // 创建工作表 sheet
  49.         Sheet s = wb.createSheet();
  50.         
  51.         wb.setSheetName(sheetIndex, sheetName);
  52.         
  53.         Row r =  s.createRow(0);
  54.         Cell c = null;
  55.         Font font = null;  
  56.         CellStyle styleHeader = null;
  57.         CellStyle styleContent = null;
  58.         
  59.         
  60.         //粗体  
  61.         font = wb.createFont();  
  62.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  63.         // 设置头样式
  64.         styleHeader = wb.createCellStyle();  
  65.         styleHeader.setFont(font);
  66.         styleHeader.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框   
  67.         styleHeader.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框   
  68.         styleHeader.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框   
  69.         styleHeader.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
  70.         // 设置内容样式
  71.         styleContent = wb.createCellStyle();
  72.         styleContent.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框   
  73.         styleContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框   
  74.         styleContent.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框   
  75.         styleContent.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
  76.         
  77.         
  78.         //设置头
  79.         for(int i=0;i<fileHeader.length;){
  80.             c = r.createCell(i);
  81.             c.setCellStyle(styleHeader);
  82.             c.setCellValue(fileHeader[i]);
  83.             i++;
  84.         }
  85.         
  86.         //设置内容
  87.         for(int rownum=0;rownum<datas.size();){ // 行 row   datas.size()
  88.             r = s.createRow(rownum+1); //创建行
  89.             for(int cellnum=0;cellnum<fileHeader.length;){
  90.                 c = r.createCell(cellnum);
  91.                
  92.                 c.setCellValue(datas.get(rownum)[cellnum]);
  93.                 c.setCellStyle(styleContent);
  94.                 cellnum++;
  95.             }
  96.             
  97.             rownum++;
  98.         }
  99.         
  100.         FileOutputStream out = null;
  101.         try {
  102.             // 创建文件或者文件夹,将内容写进去
  103.             if(FileUtil.createFile(new File(filePath))){
  104.                 out = new FileOutputStream(filePath);
  105.                 wb.write(out);
  106.             }
  107.             
  108.         } catch (Exception e) {
  109.             e.printStackTrace();
  110.         }finally {
  111.             try {
  112.                 // 关闭流
  113.                 if(out != null){
  114.                     out.flush();
  115.                     out.close();
  116.                 }
  117.             } catch (IOException e) {
  118.                 e.printStackTrace();
  119.             }
  120.         }
  121.         
  122.     }
  123.    
  124.     /**
  125.      * 读取 excel 文件内容
  126.      * @param filePath
  127.      * @param sheetIndex
  128.      */
  129.     public static List<Map<String,String>> readExcel(String filePath,int sheetIndex){
  130.         List<Map<String,String>> mapList = new ArrayList<Map<String,String>>();
  131.         // 头
  132.         List<String> list = new ArrayList<String>();
  133.         //
  134.         
  135.         int cnt = 0;
  136.         int idx = 0;
  137.         
  138.         try {  
  139.             InputStream input = new FileInputStream(filePath);  //建立输入流  
  140.             Workbook wb  = null;  
  141.             
  142.             wb = new HSSFWorkbook(input);  
  143.             
  144.             // 获取sheet页
  145.             Sheet sheet = wb.getSheetAt(sheetIndex);
  146.             
  147.             Iterator<Row> rows = sheet.rowIterator();
  148.             while (rows.hasNext()) {
  149.                 Row row = rows.next();
  150.                 Iterator<Cell> cells = row.cellIterator();
  151.                
  152.                 Map<String,String> map = new HashMap<String,String>();

  153.                 if(cnt == 0){ // 将头放进list中
  154.                     while (cells.hasNext()) {  
  155.                         Cell cell = cells.next();  
  156.                         if(isContainMergeCell(sheet)){
  157.                             cancelMergeCell(sheet);
  158.                         }
  159.                         list.add(getStringCellValue(cell));
  160.                     }
  161.                     cnt ++;
  162.                     continue;
  163.                     
  164.                 }else {
  165.                     while (cells.hasNext()) {  
  166.                         Cell cell = cells.next();  
  167.                         if(isContainMergeCell(sheet)){
  168.                             cancelMergeCell(sheet);
  169.                         }
  170.                         // 区别相同的头
  171.                         list = ListUtil.changeSameVal(list);
  172.                         map.put(list.get(idx++), getStringCellValue(cell));
  173.                     }
  174.                 }
  175.                 idx = 0;
  176.                 mapList.add(map);
  177.                
  178.             }
  179.             return mapList;
  180.         } catch (IOException ex) {  
  181.             ex.printStackTrace();  
  182.         }
  183.         return null;
  184.          
  185.     }
  186.    
  187.     /**
  188.      * 合并单元格
  189.      * @param sheet   当前sheet页
  190.      * @param firstRow 开始行
  191.      * @param lastRow  结束行
  192.      * @param firstCol  开始列
  193.      * @param lastCol  结束列
  194.      */
  195.     public static int mergeCell(Sheet sheet,int firstRow,int lastRow,int firstCol,int lastCol){
  196.         if(sheet == null){
  197.             return -1;
  198.         }
  199.         return sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
  200.     }
  201.    

  202.     /**
  203.      * 取消合并单元格
  204.      * @param sheet
  205.      * @param idx
  206.      */
  207.     public static void cancelMergeCell(Sheet sheet){
  208.         int sheetMergeCount = sheet.getNumMergedRegions();
  209.         for(int idx = 0; idx < sheetMergeCount;){
  210.             CellRangeAddress range = sheet.getMergedRegion(idx);
  211.             
  212.             String val = getMergeCellValue(sheet,range.getFirstRow(),range.getLastRow());
  213.             // 取消合并单元格
  214.             sheet.removeMergedRegion(idx);
  215.             
  216.             for(int rownum=range.getFirstRow();rownum<range.getLastRow()+1;){
  217.                 for(int cellnum=range.getFirstColumn();cellnum<range.getLastColumn()+1;){
  218.                     
  219.                     sheet.getRow(rownum).getCell(cellnum).setCellValue(val);
  220.                     
  221.                     cellnum ++;
  222.                 }
  223.                
  224.                 rownum ++;
  225.             }
  226.             
  227.             idx++;
  228.         }
  229.     }
  230.    
  231.     /**
  232.      * 判断指定单元格是否是合并单元格
  233.      * @param sheet   当前sheet页
  234.      * @param firstRow 开始行
  235.      * @param lastRow  结束行
  236.      * @param firstCol 开始列
  237.      * @param lastCol  结束列
  238.      * @return
  239.      */
  240.     public static boolean isMergeCell(Sheet sheet,
  241.             int row ,int column){
  242.         
  243.         int sheetMergeCount = sheet.getNumMergedRegions();
  244.         for(int i = 0; i < sheetMergeCount;){
  245.             CellRangeAddress range = sheet.getMergedRegion(i);
  246.             
  247.             int firstColumn = range.getFirstColumn();  
  248.             int lastColumn = range.getLastColumn();  
  249.             int firstRow = range.getFirstRow();  
  250.             int lastRow = range.getLastRow();
  251.             if(row >= firstRow && row <= lastRow){
  252.                 if(column >= firstColumn && column <= lastColumn){  
  253.                     return true;  
  254.                 }
  255.             }
  256.             
  257.             i++;
  258.         }
  259.         return false;
  260.     }
  261.    
  262.     /**
  263.      * 判断sheet页中是否含有合并单元格
  264.      * @param sheet
  265.      * @return
  266.      */
  267.     public static boolean isContainMergeCell(Sheet sheet){
  268.         if(sheet == null){
  269.             return false;
  270.         }
  271.         return sheet.getNumMergedRegions()>0 ? true : false;
  272.     }
  273.    
  274.     /**
  275.      * 获取指定合并单元的值
  276.      * @param sheet
  277.      * @param row
  278.      * @param column
  279.      * @return
  280.      */
  281.     public static String getMergeCellValue(Sheet sheet,
  282.             int row ,int column){
  283.         
  284.         int sheetMergeCount = sheet.getNumMergedRegions();
  285.         for(int i = 0; i < sheetMergeCount;){
  286.             CellRangeAddress range = sheet.getMergedRegion(i);
  287.             
  288.             int firstColumn = range.getFirstColumn();  
  289.             int lastColumn = range.getLastColumn();  
  290.             int firstRow = range.getFirstRow();  
  291.             int lastRow = range.getLastRow();
  292.             if(row >= firstRow && row <= lastRow){
  293.                 if(column >= firstColumn && column <= lastColumn){  
  294.                     Row fRow = sheet.getRow(firstRow);   
  295.                     Cell fCell = fRow.getCell(firstColumn);
  296.                     
  297.                     return getStringCellValue(fCell) ;   
  298.                 }
  299.             }
  300.             
  301.             i++;
  302.         }
  303.         
  304.         return null;
  305.     }
  306.    
  307.     /**
  308.      * 获取单元格的值
  309.      * @param cell
  310.      * @return
  311.      */
  312.     public static String getStringCellValue(Cell cell) {  
  313.         String strCell = "";  
  314.         if(cell==null) return strCell;  
  315.         switch (cell.getCellType()) {  
  316.             case Cell.CELL_TYPE_STRING:
  317.                 strCell = cell.getRichStringCellValue().getString().trim();  
  318.                 break;  
  319.             case Cell.CELL_TYPE_NUMERIC:   
  320.                 strCell = String.valueOf(cell.getNumericCellValue());  
  321.                 break;  
  322.             case Cell.CELL_TYPE_BOOLEAN:      
  323.                 strCell = String.valueOf(cell.getBooleanCellValue());  
  324.                 break;  
  325.             case Cell.CELL_TYPE_FORMULA:      
  326.                 FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();  
  327.                 evaluator.evaluateFormulaCell(cell);  
  328.                 CellValue cellValue = evaluator.evaluate(cell);  
  329.                 strCell = String.valueOf(cellValue.getNumberValue()) ;  
  330.                 break;  
  331.             default:  
  332.                 strCell = "";  
  333.         }  
  334.         return strCell;  
  335.     }

  336. }
复制代码



调用方式如下 ExcelUtilTester.java
  1. package pers.kangxu.datautils.test;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. import pers.kangxu.datautils.utils.ExcelUtil;

  5. public class ExcelUtilTester {

  6.     public static void main(String[] args) {
  7.         List<String[]> datas = new ArrayList<String[]>();
  8.         datas.add(new String[]{"狗熊","母","250"});
  9.         datas.add(new String[]{"猪粮","不明","251"});
  10.         //ExcelUtil.writeExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls","sheet1",0, new String[]{"姓名","年龄","性别"}, datas);
  11.         
  12.         System.out.println(ExcelUtil.readExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls", 0));
  13.         
  14.     }
  15. }
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本专栏主要提供Java相关技术的学习交流。望大家积极踊跃发言,共建一个良好的学习环境!
  • 今日
    1
  • 主题
    366

推荐阅读

精选帖子

Archiver|手机版|小黑屋| 极客社区 ( 京ICP备14042200号-2 )

Powered by 张董丶 X3.2 © 2016-2026

返回顶部 返回列表