java用POI操作excel——隨便寫一下,最基礎的東西


前兩天部門實施在做一個東西,需要把客戶放在Excel中的數據導入到Oracle數據庫中,我就想着直接寫一個模板,必要的時候改一下實體類應該可以解放實施同事的雙手,不過在實際寫的過程中,還是碰到很多問題,最需要解決的應該是數據類型的問題。

首先說一下和POI相關的導入和導出,這也是在實際應用中用的最多的部分,如果后續有時間話,我會把包括jdbc操作Oracle的代碼也貼上來,以后用的時候直接來博客園復制一下。

Excel有兩種格式,.xls(07版本以前)和.xlsx(07及之后的版本),在對不同格式的Excel進行操作的時候,寫的代碼也不同。

先來介紹一下關於這個最基礎的內容,就是全部內容都給固定值,這樣應該好理解一些,在代碼中有詳細的注釋

  1 package com.bd.excel;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 
  9 import org.apache.poi.hssf.usermodel.HSSFCell;
 10 import org.apache.poi.hssf.usermodel.HSSFRow;
 11 import org.apache.poi.hssf.usermodel.HSSFSheet;
 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 13 import org.apache.poi.ss.usermodel.Cell;
 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.XSSFCell;
 18 import org.apache.poi.xssf.usermodel.XSSFRow;
 19 import org.apache.poi.xssf.usermodel.XSSFSheet;
 20 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 21 
 22 
 23 
 24 
 25 
 26 /*
 27  * Excel導入和導出的工具類
 28  * 
 29  * */
 30 public class ReadExcel {
 31     
 32     
 33     //main方法測試
 34     public static void main(String[] args) throws Exception {
 35         //writeExcel07();
 36         //readExcle07();
 37         //readExcel03and07();
 38         writeExcel07();
 39     }
 40     
 41     
 42     /*
 43      * 讀取excel的方法, 07之前的版本,文件類型為.xls
 44      *               07及07之后的版本,文件類型為.xlsx
 45      *               
 46      * */
 47       public static void writeExcel03() throws Exception{
 48           
 49          /* 
 50           * 
 51           * 
 52           * 這是最基本的創建excel的方法,所有的值都給的固定值。
 53           * 
 54           */
 55           //創建新excel文檔,07版本之前均可以這么寫
 56           HSSFWorkbook workbook = new HSSFWorkbook();
 57           //新建工作表
 58           HSSFSheet sheet = workbook.createSheet("test");
 59           //新建行
 60           HSSFRow row = sheet.createRow(0);
 61           //取第一行第一列
 62           HSSFCell cell = row.createCell(0);
 63           //給第一行第一列賦值
 64           cell.setCellValue("我是誰?");
 65           //將新建的工作表保存到硬盤中
 66           FileOutputStream fos = new FileOutputStream(new File("E:\\testExcel.xls"));
 67           workbook.write(fos);
 68           fos.close();
 69           
 70           
 71           
 72       }
 73       
 74       
 75       public static void readExcle03() throws Exception{
 76           
 77           /*
 78            * 最簡單的讀取excel的方法,給的值是固定的,可以取出對應表格中任何一個位置的值
 79            * 07之前的版本都可以這么寫
 80            * */
 81           
 82           //創建輸入流
 83           FileInputStream fis = new FileInputStream(new File("E:\\testExcel.xls"));
 84           //通過構造函數傳參
 85           HSSFWorkbook workbook = new HSSFWorkbook(fis);
 86           //獲取工作表
 87           HSSFSheet sheet = workbook.getSheetAt(0);
 88           //獲取行,方法為getRow()
 89           HSSFRow row = sheet.getRow(0);
 90           //獲取單元格,方法為row.getCell()
 91           HSSFCell cell = row.getCell(0);
 92           //獲取單元格中的值
 93           String cellvalue = cell.getStringCellValue();
 94           System.out.println(cellvalue);
 95           fis.close();
 96       }
 97       /*
 98        * 在實際應用中,在讀取文件的時候,我們不一定確定讀取的excel的具體版本,所以,在輸入和輸出的語句需要添加判斷來讓其適應不同的版本
 99        * 
100        * */
101       public static void readExcel03and07() throws Exception{
102           //讀取文件的路徑
103           String filepath = "E:\\testExcel.xls";
104           //判斷文件的格式,
105           if(filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")){
106               FileInputStream fis = new FileInputStream(filepath);
107               boolean is03Excel = filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")?true:false;
108               Workbook workbook = is03Excel ? new HSSFWorkbook(fis):new XSSFWorkbook(fis);
109               Sheet sheet = workbook.getSheetAt(0);
110               Row row = sheet.getRow(0);
111               Cell cell = row.getCell(0);
112               System.out.println("第一行第一列的數據是:"+cell.getStringCellValue());
113               
114           }
115       }
116       
117       /*
118        * 創建07及以后excel的寫法
119        * 
120        * */
121       public static void writeExcel07() throws Exception{
122           
123           /*
124            * 創建07之后的版本使用的工廠類為XSSFWorkbook
125            * 
126            * */
127           //創建新表格文件
128           XSSFWorkbook workbook = new XSSFWorkbook();
129           //創建新表單
130           XSSFSheet sheet = workbook.createSheet("test07");
131           //創建sheet表單中的行
132           XSSFRow row = sheet.createRow(0);
133           //選取行中對應的列
134           XSSFCell cell = row.createCell(0);
135           //給對應的列中賦值
136           cell.setCellValue("test");
137           //輸出創建的文件,存儲到硬盤中
138           FileOutputStream fos = new FileOutputStream(new File("E:\\test07.xlsx"));
139           //workbook的write方法調用,不能忘啊
140           workbook.write(fos);
141           fos.close();
142       }
143 }

接下來給出動態的代碼,沒有結合實體類。其實就是“兩個for循環可以干嘛”的答案,兩個for循環可以遍歷Excel表格啊

package com.bd.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


/*
 * 主要實現的功能:批量導入和導出excel文件中的內容
 * 相當於動態賦值,兩個for循環可以干嘛:只要是二維形式的數據,兩個for循環就可以讀取獲取進行賦值。
 * 
 * */
public class ImportAndOutput {
    
    //main方法測試
    public static void main(String[] args) throws Exception {
        //importdata();
        outputdate();
    }
    
    /*
     * importdata:給excel文檔中導入數據的方法
     * 
     * */
      public static void importdata() throws Exception{
          //創建一個excel文檔,由於不同格式的excel寫法不同,這里統一采用xlsx格式,現在用的比較多,對應的版本為07及07之后的版本。
          
          //創建一個新的excel文本
          XSSFWorkbook workbook = new XSSFWorkbook();
          //創建一個sheet工作表:員工信息表,包含的屬性:工號,姓名,性別
          XSSFSheet sheet = workbook.createSheet("員工表信息");
          //添加表頭對應的信息,把對應的表頭信息放到數組headinf中
          String[] headinf = {"工號","姓名","性別"};
          //把表頭對應的信息放到表格對應位置
          for(int i = 0;i <headinf.length;i++){
              //讀取表格中表頭所在的行,即為第一行,下標為0
              XSSFRow row = sheet.createRow(0);
              //把數組中的元素依次放進去
              XSSFCell cell = row.createCell(i);
              System.out.println(headinf[i]);
              cell.setCellValue(headinf[i]);
          }
          /*
           * 開始給后面的表格賦值,雙重for,正常情況下,可以把需要放進來的數據放在集合或者數組中,通過集合或數組的長度來獲取數據的條數
           * 沒有現成的數據,所以要隨機生成,數據大小為50條
           * 
           * */
          for(int i = 0;i < 50;i++){
              //讀取當前插入數據的行
              XSSFRow row = sheet.createRow(i+1);
              //給讀取的行中的列進行賦值
              for(int j = 0;j < 3;j++){
                  //創建對應的列
                  XSSFCell cell = row.createCell(j);
                  //工號生成的規則要依次增加,給工號賦值,從1到50
                  if(j == 0){
                      cell.setCellValue(i+1);
                  }
                  //姓名的生成規則,50個人的名字一樣的太多的話,不夠美觀,所以讓其隨機生成
                  if(j == 1){
                      int x = (int)(1+Math.random()*(10-1+1));
                      int m = (int)(1+Math.random()*(10-1+1));
                      String[] xing = {"趙","錢","孫","李","周","吳","鄭","王","馮","陳"};
                      String[] ming = {"零","一","二","三","四","五","六","七","八","九"};
                      String name = xing[x-1]+ming[m-1];
                      cell.setCellValue(name);
                  }
                  //給性別賦值
                  if(j == 2){
                      int t = (int)(1+Math.random()*(10-1+1));
                      if(t%2 == 0){
                          cell.setCellValue("女");
                      }else{
                          cell.setCellValue("男");
                      }
                  }
              }
          }
          //賦值結束,將內容輸出到硬盤中
          FileOutputStream fos = new FileOutputStream(new File("E:\\員工信息表.xlsx"));
          workbook.write(fos);
          fos.close();
          
      }
      
      //outputdata:讀取excel表中的數據,讀取的模板為剛才生成的excel表格
      public static void outputdate() throws Exception{
          
          //用FileInputStream讀入需要讀取的文件
          String filepath = "E:\\員工信息表.xlsx";
          File empinf = new File(filepath);
          FileInputStream fis = new FileInputStream(empinf);
          //判斷讀取的文件的格式
          boolean is03Excel = filepath.matches("^.+\\.(?i)(xls)$");
          //讀取工作簿
          Workbook workbook = is03Excel?new HSSFWorkbook(fis):new XSSFWorkbook(fis);
          //讀取工作表
          Sheet sheet = workbook.getSheetAt(0);
          //讀取表格中的內容
          for(int i = 2;i < sheet.getPhysicalNumberOfRows();i++){
              //獲取對應的行
              Row row = sheet.getRow(i);
              //取對應行中每一列的數據
              for(int j = 1;j < row.getPhysicalNumberOfCells();i++){
                  //取該行中的列
                  Cell cell = row.getCell(j);
                  //把對應的值取出來
                  String cellvalue = cell.getStringCellValue();
                  System.out.print(cellvalue);
              }
              System.out.println();
          }
          
         //在控制台輸出結果
          //fis.close();
      }
}

這樣以后用的話直接把代碼拿過去,把相關內容刪除,然后寫入自己需要的就可以了。

最后,我覺得有必要分享一下需要的jar包,用的是3.17版本的,不是最穩定的3.15

鏈接地址:http://pan.baidu.com/s/1i4NWOtf     密碼:tz7s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM