前兩天部門實施在做一個東西,需要把客戶放在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