poi編程

POI編程:
  使用java解析和建立office文檔的工具.
  經常使用於處理excel文件.java

導入jar包
  2003版
    poi-3.10-FINAL-20140208.jar 核心jar包
    lib/*.jar 依賴的jar包.
  2007版 創建在2003版基礎之上的
    poi-3.10-FINAL-20140208.jar 核心jar包
    poi-excelant-3.10-FINAL-20140208.jar 文件讀寫的jar
    poi-ooxml-3.10-FINAL-20140208.jar 2007版擴展jar包.
    poi-ooxml-schemas-3.10-FINAL-20140208.jar 2007版XML標準jar包.
    poi-scratchpad-3.10-FINAL-20140208.jar 作文檔格式處理.
    lib/*.jar 依賴的jar包.
    ooxml-lib/*.jar poi-ooxml jar包依賴的插件
      dom4j-1.6.1.jar
      stax-api-1.0.1.jar
      xmlbeans-2.3.0.jarapache

POI中行號和列號的計數方式:
  行號:
    從0開始計數.
    lastRowNum是最後一行的行號.
  列號:
    從0開始計數.
    lastCellNum是最後一列編號+1.

  1. 解析
    1.1 IO流定位文件
    1.2 建立POI技術中的excel文檔對象工做薄
    1.3 解析工做文件Sheet
    1.4 解析行
    1.5 解析行中的每列
    1.6 回收資源

  2. 建立
    2.1 建立一個空的文檔對象.
    2.2 在文檔中建立Sheet文件
    2.3 在文件中建立行
    2.4 在行中建立列
    2.5 輸出文件編程

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------api

  1 package test.poi;
  2 
  3 import java.io.FileOutputStream;
  4 import java.io.OutputStream;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  9 import org.apache.poi.hssf.util.HSSFColor;
 10 import org.apache.poi.ss.usermodel.Cell;
 11 import org.apache.poi.ss.usermodel.CellStyle;
 12 import org.apache.poi.ss.usermodel.Color;
 13 import org.apache.poi.ss.usermodel.Font;
 14 import org.apache.poi.ss.usermodel.Row;
 15 import org.apache.poi.ss.usermodel.Sheet;
 16 import org.apache.poi.ss.usermodel.Workbook;
 17 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 18 
 19 /**
 20 * 建立Excel文件
 21 */
 22 public class ExportExcel {
 23 
 24 /**
 25 * 導出Excel文件
 26 * @param List<String[]> 要導出的文件內容.
 27 * @param type 導出的文件的格式.
 28 */
 29 public void exportExcel(List<String[]> datas, String type) throws Exception{
 30 
 31 // 1. 建立Excel文檔對象
 32 Workbook workbook = null;
 33 if(type.equals("xls")){
 34 // 2003
 35 workbook = new HSSFWorkbook();
 36 }else if(type.equals("xlsx")){
 37 // 2007
 38 workbook = new XSSFWorkbook();
 39 }else{
 40 return;
 41 }
 42 
 43 // 2. 建立Sheet文件
 44 Sheet sheet = workbook.createSheet();
 45 
 46 // 設置行寬
 47 sheet.setColumnWidth(0, 3000);
 48 sheet.setColumnWidth(1, 3000);
 49 sheet.setColumnWidth(2, 3000);
 50 sheet.setColumnWidth(3, 3000);
 51 sheet.setColumnWidth(4, 3000);
 52 
 53 // 3. 建立行
 54 // 3.1 建立表頭
 55 // 設置表頭內容樣式
 56 CellStyle headerStyle = workbook.createCellStyle();
 57 headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
 58 headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
 59 headerStyle.setBorderLeft(CellStyle.BORDER_THIN);
 60 headerStyle.setBorderRight(CellStyle.BORDER_THIN);
 61 headerStyle.setBorderTop(CellStyle.BORDER_THIN);
 62 headerStyle.setFillBackgroundColor(HSSFColor.BLUE.index);
 63 Font headerFont = workbook.createFont();
 64 headerFont.setFontName("微軟雅黑");
 65 headerFont.setBoldweight((short) 16);
 66 headerFont.setColor(HSSFColor.RED.index);
 67 headerStyle.setFont(headerFont);
 68 
 69 Row row = sheet.createRow(0);
 70 // 4. 建立列
 71 Cell cell = row.createCell(0);
 72 cell.setCellStyle(headerStyle);
 73 cell.setCellValue("卡號");
 74 
 75 cell = row.createCell(1);
 76 cell.setCellStyle(headerStyle);
 77 cell.setCellValue("姓名");
 78 
 79 cell = row.createCell(2);
 80 cell.setCellStyle(headerStyle);
 81 cell.setCellValue("金額");
 82 
 83 cell = row.createCell(3);
 84 cell.setCellStyle(headerStyle);
 85 cell.setCellValue("代扣");
 86 
 87 cell = row.createCell(4);
 88 cell.setCellStyle(headerStyle);
 89 cell.setCellValue("備註");
 90 
 91 for(int i = 0; i < datas.size(); i++){
 92 row = sheet.createRow(i+1);
 93 int cellNums = datas.get(i).length;
 94 for(int j = 0; j < cellNums; j++){
 95 String cellValue = (datas.get(i))[j];
 96 cell = row.createCell(j);
 97 cell.setCellValue(cellValue);
 98 }
 99 }
100 
101 // 5. 輸出文件內容
102 // 5.1 建立輸出流.
103 OutputStream out = new FileOutputStream("test."+type);
104 
105 // 5.2 依託輸出流,輸出建立的Excel文件內容.
106 workbook.write(out);
107 
108 }
109 
110 public static void main(String[] args) throws Exception {
111 
112 List<String[]> datas = new ArrayList<>();
113 datas.add(new String[]{"6225880111009999000", "張三", "10000", "500", "工資"});
114 datas.add(new String[]{"6225880111009999010", "李四", "10000", "500", "工資"});
115 datas.add(new String[]{"6225880111009999020", "王五", "10000", "500", "工資"});
116 datas.add(new String[]{"6225880111009999030", "趙六", "10000", "500", "工資"});
117 
118 new ExportExcel().exportExcel(datas, "xls");
119 
120 }
121 
122 }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------app

  1 package test.poi;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.InputStream;
  5 import java.text.DecimalFormat;
  6 import java.text.SimpleDateFormat;
  7 import java.util.ArrayList;
  8 import java.util.Arrays;
  9 import java.util.Date;
 10 import java.util.List;
 11 
 12 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 13 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 14 import org.apache.poi.ss.usermodel.Cell;
 15 import org.apache.poi.ss.usermodel.Row;
 16 import org.apache.poi.ss.usermodel.Sheet;
 17 import org.apache.poi.ss.usermodel.Workbook;
 18 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 19 
 20 /**
 21 * 解析Excel文件
 22 */
 23 public class ParseExcel {
 24 
 25 /**
 26 * 解析Excel文件的方法.
 27 * @return
 28 */
 29 public List<String[]> parseExcel(String fileName, int startRow) throws Exception{
 30 
 31 // 1. 輸入流
 32 InputStream in = new FileInputStream(fileName);
 33 
 34 // 2. 建立Excel文檔對象
 35 Workbook workbook = null;
 36 if(fileName.endsWith(".xls")){
 37 // 2003
 38 workbook = new HSSFWorkbook(in);
 39 }else if(fileName.endsWith(".xlsx")){
 40 // 2007
 41 workbook = new XSSFWorkbook(in);
 42 }else{
 43 return null;
 44 }
 45 
 46 // 3. 獲取Sheet
 47 // 根據Sheet文件名獲取文件
 48 // workbook.getSheet("sheet1");
 49 // 根據下標獲取文件
 50 Sheet sheet = workbook.getSheetAt(0);
 51 
 52 // 4. 迭代行
 53 // 4.1 獲取文件中的最後一行.判斷開始行是否小於等於最後一行的行號
 54 int lastRow = sheet.getLastRowNum();
 55 List<String[]> result = new ArrayList<>();
 56 if(lastRow >= startRow){
 57 
 58 // 迭代
 59 for(int rowNum = startRow; rowNum <= lastRow; rowNum++){
 60 // 根據行號獲取行數據
 61 Row row = sheet.getRow(rowNum);
 62 
 63 // 5. 迭代行中的單元格. [列]
 64 // 5.1 獲取首列和尾列的列號
 65 int firstCellNum = row.getFirstCellNum();
 66 int lastCellNum = row.getLastCellNum();
 67 String[] rowValues = new String[lastCellNum - firstCellNum];
 68 for(int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++){
 69 String rowValue = "";
 70 // 獲取單元格
 71 Cell cell = row.getCell(cellNum);
 72 // 處理單元格數據
 73 if(cell.getCellType() == cell.CELL_TYPE_NUMERIC){
 74 // 數學類型數據, 包含數字,日期
 75 if(HSSFDateUtil.isCellDateFormatted(cell)){
 76 // 判斷單元格數據是否爲日期
 77 Date cellValue = cell.getDateCellValue();
 78 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 79 rowValue = sdf.format(cellValue);
 80 }else{
 81 // 數學類型
 82 double cellValue = cell.getNumericCellValue();
 83 // 建立數學格式化對象
 84 DecimalFormat formatter = new DecimalFormat();
 85 formatter.applyPattern("#");
 86 rowValue = formatter.format(cellValue);
 87 }
 88 }else if(cell.getCellType() == cell.CELL_TYPE_STRING){
 89 // 字符串類型數據
 90 rowValue = cell.getRichStringCellValue().getString();
 91 }else if(cell.getCellType() == cell.CELL_TYPE_BLANK){
 92 // 空數據
 93 rowValue = "";
 94 }
 95 rowValues[cellNum] = rowValue;
 96 }
 97 result.add(rowValues);
 98 }
 99 }else{
100 // 邏輯錯誤
101 return null;
102 }
103 
104 // 6. 回收資源
105 
106 return result;
107 }
108 
109 public static void main(String[] args) throws Exception {
110 List<String[]> result = new ParseExcel().parseExcel("測試2007.xlsx", 2);
111 for(String[] row : result){
112 System.out.println(Arrays.toString(row));
113 }
114 }
115 
116 }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------dom

相關文章
相關標籤/搜索