Java如何處理EXCEL的讀取

需要包:poi-3.5.jar、poi-ooxml-3.5.jar

 

實例:

[java] view plaincopy
  1. public class ProcessExcel {  
  2.   
  3.     private Workbook wb = null;  
  4.     private Sheet s = null;  
  5.     private Row row = null;  
  6.   
  7.     public ProcessExcel(String filePath) {  
  8.         try {  
  9.             System.out.println(filePath);  
  10.             if (filePath.endsWith("xls")) {  
  11.                 wb =  new HSSFWorkbook(new FileInputStream(new File(filePath)));  
  12.             } else {  
  13.                 wb = new XSSFWorkbook(filePath);  
  14.             }  
  15.             System.out.println(wb);  
  16.         } catch (IOException e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
  20.   
  21.     /** 
  22.      * 表格表2-27-1 院(系)教學效果——本科生學科競賽獲獎情況 (TBL_DEPART_SUBJECT_HONOR)  
  23.      * 
  24.      * @param isInsert 
  25.      */  
  26.     public ExcelModel importExcel3281() {  
  27.         ExcelModel em = new ExcelModel();  
  28.         List<TblDepartSubjectHonor> list = new ArrayList<TblDepartSubjectHonor>();  
  29.         TblDepartSubjectHonor eb = null;  
  30.         s = wb.getSheetAt(0);  
  31.         for (int i = 2; i < s.getPhysicalNumberOfRows(); i++) {  
  32.             for (int j = 0; j < 7; j++) {  
  33.                 if (s.getRow(i).getCell(j) == null) {  
  34.                     em.setState("第" + (i + 1) + "行第" + (j + 1)  
  35.                             + "列爲空值,請檢查好再導入.");  
  36.                     return em;  
  37.                 }  
  38.             }  
  39.         }  
  40.   
  41.         for (int i = 2; i < s.getPhysicalNumberOfRows(); i++) {  
  42.             eb = new TblDepartSubjectHonor();  
  43.             row = s.getRow(i);  
  44.             eb.setHjxm(row.getCell(0).toString());// 獲取項目  
  45.             eb.setJlmc(StringUtils.trim(row.getCell(1).toString()));  
  46.             String JB = StringUtils.trim(row.getCell(2).toString());  
  47.             if (JB.equals("國家級")) {  
  48.                 eb.setJb("01");  
  49.             } else if (JB.equals("省級")) {  
  50.                 eb.setJb("02");  
  51.             } else if (JB.equals("市級")) {  
  52.                 eb.setJb("03");  
  53.             } else {  
  54.                 eb.setJb("04");  
  55.             }  
  56.             eb.setDj(StringUtils.trim(row.getCell(3).toString()));  
  57.             eb.setSydw(StringUtils.trim(row.getCell(4).toString()));  
  58.             eb.setHjzxm(StringUtils.trim(row.getCell(5).toString()));  
  59.             eb.setZdls(StringUtils.trim(row.getCell(6).toString()));  
  60.             String HDNF = StringUtils.trim(row.getCell(7).toString());  
  61.             // 數字處理問題!  
  62.             int l = HDNF.indexOf(".");  
  63.             if (l == -1) {  
  64.                 l = HDNF.length();  
  65.             }  
  66.             eb.setHdnf(HDNF.substring(0, l));  
  67.             list.add(eb);  
  68.         }  
  69.         em.setDatas(list);  
  70.         return em;  
  71.     }  
  72. }  

構造函數是靜態初始化塊,讀取  文件路徑+文件名  根據後綴的不同創建不同的對象。

ProcessExcel的處理過程就是讀取Excel的特定行,特定列,然後把數據轉化爲實體類對象,再將這個對象賦給List,然後 在DAO層採用批處理將數據插入到數據庫中。

ExcelModel  類的結構如下:

[java] view plaincopy
  1. import java.util.List;  
  2.   
  3. public class ExcelModel {  
  4.     public List datas;  
  5.     public String state;  
  6.     public List getDatas() {  
  7.         return datas;  
  8.     }  
  9.     public void setDatas(List datas) {  
  10.         this.datas = datas;  
  11.     }  
  12.     public String getState() {  
  13.         return state;  
  14.     }  
  15.     public void setState(String state) {  
  16.         this.state = state;  
  17.     }  
  18. }  


 

爲什麼還要重新定義一個類來做爲返回的參數,而不直接使用List對象接受返回對象列表呢?

這相當於ADTs(抽象對象模型),把與處理Excel的相關信息封裝起來,比如說這個對象不僅有數據對象列表,還有狀態信息,如果讀取Excel時,Excel數據填入向不合法呢,這個狀態信息就可以向用戶 ,當然不只限制與這兩個數據成員,當我們還需要其他處理Excel的相關信息的時候都可以向這個Excel裏面添加數據成員來進行擴展.

 

POI操作Excel常用方法總結

 

一、 POI簡介

Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。

二、 HSSF概況

HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF 爲讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。

三、 POI EXCEL文檔結構類

HSSFWorkbook excel文檔對象

HSSFSheet excel的sheet HSSFRow excel的行

HSSFCell excel的單元格 HSSFFont excel字體

HSSFName 名稱 HSSFDataFormat 日期格式

HSSFHeader sheet頭

HSSFFooter sheet尾

HSSFCellStyle cell樣式

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 錯誤信息表

四、 EXCEL常用操作方法

1、 得到Excel常用對象

  1.  
  2. POIFSFileSystem fs=newPOIFSFileSystem(new      FileInputStream("d:\test.xls"));
  1.  
  2. //得到Excel工作簿對象
  1.  
  2. HSSFWorkbook wb = new HSSFWorkbook(fs);
  1.  
  2. //得到Excel工作表對象  
  3. HSSFSheet sheet =      wb.getSheetAt(0);
  1.  
  2. //得到Excel工作表的行
  1.  
  2. HSSFRow      row = sheet.getRow(i);
  1.  
  2. //得到Excel工作表指定行的單元格
  1.  
  2. HSSFCell cell = row.getCell((short) j);
  1.  
  2. cellStyle = cell.getCellStyle();//得到單元格樣式

2、建立Excel常用對象

  1.  
  2. HSSFWorkbook wb = new HSSFWorkbook();//創建Excel工作簿對象
  1.  
  2. HSSFSheet sheet = wb.createSheet("new      sheet");//創建Excel工作表對象
  1.  
  2. HSSFRow row = sheet.createRow((short)0); //創建Excel工作表的行
  1.  
  2. cellStyle = wb.createCellStyle();//創建單元格樣式
  1.  
  2. row.createCell((short)0).setCellStyle(cellStyle); //創建Excel工作表指定行的單元格
  1.  
  2. row.createCell((short)0).setCellValue(1); //設置Excel工作表的值
  1.  
  2. 3、設置sheet名稱和單元格內容  
    1.   
    2. wb.setSheetName(1,       "第一張工作表",HSSFCell.ENCODING_UTF_16);   
    3. cell.setEncoding((short)       1);  
     
    1.   
    2. cell.setCellValue("單元格內容");        

4、取得sheet的數目

  1.  
  2. wb.getNumberOfSheets()     

5、 根據index取得sheet對象

view plaincopy to clipboardprint?

  1.  
  2. HSSFSheet sheet = wb.getSheetAt(0);

6、取得有效的行數

  1.  
  2. int      rowcount = sheet.getLastRowNum();

7、取得一行的有效單元格個數

  1.  
  2. row.getLastCellNum();     

8、單元格值類型讀寫

  1.  
  2. cell.setCellType(HSSFCell.CELL_TYPE_STRING); //設置單元格爲STRING類型
  1.  
  2. cell.getNumericCellValue();//讀取爲數值類型的單元格內容

9、設置列寬、行高

  1.  
  2. sheet.setColumnWidth((short)column,(short)width);
  1.  
  2. row.setHeight((short)height);

10、添加區域,合併單元格

  1.  
  2. Region region = new      Region((short)rowFrom,(short)columnFrom,(short)rowTo
  1.  
  2. ,(short)columnTo);//合併從第rowFrom行columnFrom列
  1.  
  2. sheet.addMergedRegion(region);// 到rowTo行columnTo的區域
  1.  
  2. //得到所有區域
  1.  
  2. sheet.getNumMergedRegions()     

11、保存Excel文件

  1.  
  2. FileOutputStream fileOut = new FileOutputStream(path);  
  3. wb.write(fileOut);

12、根據單元格不同屬性返回字符串數值

  1.  
[html] view plaincopy
  1. 1.public String getCellStringValue(HSSFCell cell) {   
  2.   2.String cellValue = "";   
  3.   3.switch (cell.getCellType()) {   
  4.   4.case HSSFCell.CELL_TYPE_STRING://字符串類型   
  5.   5.cellValue      = cell.getStringCellValue();   
  6.   6.if(cellValue.trim().equals("")||cellValue.trim().length()<=0)        
  7.   7.cellValue=" ";   
  8.   8.break;   
  9.   9.case HSSFCell.CELL_TYPE_NUMERIC: //數值類型   
  10.   10.cellValue      = String.valueOf(cell.getNumericCellValue());   
  11.   11.break;   
  12.   12.case HSSFCell.CELL_TYPE_FORMULA: //公式   
  13.   13.cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);        
  14.   14.cellValue      = String.valueOf(cell.getNumericCellValue());   
  15.   15.break;   
  16.   16.case HSSFCell.CELL_TYPE_BLANK:   
  17.   17.cellValue=" ";   
  18.   18.break;   
  19.   19.case HSSFCell.CELL_TYPE_BOOLEAN:   
  20.   20.break;   
  21.   21.case HSSFCell.CELL_TYPE_ERROR:   
  22.   22.break;   
  23.   23.default:   
  24.   24.break;   
  25.   25.}        
  26.   26.return cellValue;   
  27.   27.}        


 

  •  

13、常用單元格邊框格式

  1.  
  2. HSSFCellStyle      style = wb.createCellStyle();
  1.  
  2. style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下邊框
  1.  
  2. style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左邊框
  1.  
  2. style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框
  1.  
  2. style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框

14、設置字體和內容位置

  1.  
  2. HSSFFont      f = wb.createFont();
  1.  
  2. f.setFontHeightInPoints((short) 11);//字號
  1.  
  2. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗
  1.  
  2. style.setFont(f);       
  3. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中
  1.  
  2. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
  1.  
  2. style.setRotation(short rotation);//單元格內容的旋轉的角度
  1.  
  2. HSSFDataFormat      df = wb.createDataFormat();  
  3. style1.setDataFormat(df.getFormat("0.00%"));//設置單元格數據格式
  1.  
  2. cell.setCellFormula(string);//給單元格設公式
  1.  
  2. style.setRotation(short rotation);//單元格內容的旋轉的角度

15、插入圖片

  1.  
  2. //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray
  1.  
  2. ByteArrayOutputStream byteArrayOut = new      ByteArrayOutputStream();
  1.  
  2. BufferedImage bufferImg = ImageIO.read(new      File("ok.jpg"));
  1.  
  2. ImageIO.write(bufferImg,"jpg",byteArrayOut);  
  3. //讀進一個excel模版
  1.  
  2. FileInputStream fos = new      FileInputStream(filePathName+"/stencil.xlt");
  1.  
  2. fs = new POIFSFileSystem(fos);
  1.  
  2. //創建一個工作薄  
  3. HSSFWorkbook wb = new      HSSFWorkbook(fs);
  1.  
  2. HSSFSheet      sheet = wb.getSheetAt(0);
  1.  
  2. HSSFPatriarch      patriarch = sheet.createDrawingPatriarch();
  1.  
  2. HSSFClientAnchor anchor = new      HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);  
  3. patriarch.createPicture(anchor      ,      wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));     

16、調整工作表位置

  1.  
  2. HSSFWorkbook wb = new HSSFWorkbook();
  1.  
  2. HSSFSheet sheet = wb.createSheet("format      sheet");
  1.  
  2. HSSFPrintSetup      ps = sheet.getPrintSetup();  
  3. sheet.setAutobreaks(true);
  1.  
  2. ps.setFitHeight((short)1);
  1.  
  2. ps.setFitWidth((short)1);

17、設置打印區域

  1.  
  2. HSSFSheet sheet = wb.createSheet("Sheet1");     
  1.  
  2. wb.setPrintArea(0, "$A$1:$C$2");

18、標註腳註

  1.  
  2. HSSFSheet sheet = wb.createSheet("format      sheet");
  1.  
  2. HSSFFooter      footer = sheet.getFooter()
  1.  
  2. footer.setRight( "Page " + HSSFFooter.page() +      " of " + HSSFFooter.numPages() );

19、在工作單中清空行數據,調整行位置

  1.  
  2. HSSFWorkbook wb = new HSSFWorkbook();
  1.  
  2. HSSFSheet sheet = wb.createSheet("row      sheet");
  1.  
  2. //      Create various cells and rows for spreadsheet.
  1.  
  2. //      Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)  
  3. sheet.shiftRows(5, 10, -5);

20、選中指定的工作表

  1.  
  2. HSSFSheet sheet = wb.createSheet("row      sheet");  
  3. heet.setSelected(true);

21、工作表的放大縮小

  1.  
  2. HSSFSheet sheet1 = wb.createSheet("new      sheet");
  1.  
  2. sheet1.setZoom(1,2); // 50 percent magnification

22、頭注和腳註

  1.  
  2. HSSFSheet sheet = wb.createSheet("new      sheet");
  1.  
  2. HSSFHeader      header = sheet.getHeader();
  1.  
  2. header.setCenter("Center Header");
  1.  
  2. header.setLeft("Left Header");
  1.  
  2. header.setRight(HSSFHeader.font("Stencil-Normal",      "Italic") +
  1.  
  2. HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal      Italic font and size 16");

23、自定義顏色

  1.  
  2. HSSFCellStyle      style = wb.createCellStyle();
  1.  
  2. style.setFillForegroundColor(HSSFColor.LIME.index);     
  1.  
  2. style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
  1.  
  2. HSSFFont      font = wb.createFont();
  1.  
  2. font.setColor(HSSFColor.RED.index);     
  1.  
  2. style.setFont(font);       
  3. cell.setCellStyle(style);

24、填充和顏色設置

  1.  
  2. HSSFCellStyle      style = wb.createCellStyle();
  1.  
  2. style.setFillBackgroundColor(HSSFColor.AQUA.index);     
  1.  
  2. style.setFillPattern(HSSFCellStyle.BIG_SPOTS);     
  1.  
  2. HSSFCell cell = row.createCell((short) 1);
  1.  
  2. cell.setCellValue("X");
  1.  
  2. style      = wb.createCellStyle();
  1.  
  2. style.setFillForegroundColor(HSSFColor.ORANGE.index);     
  1.  
  2. style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
  1.  
  2. cell.setCellStyle(style);     

25、強行刷新單元格公式

  1.  
  2. HSSFFormulaEvaluator eval=new      HSSFFormulaEvaluator((HSSFWorkbook) wb);
  1.  
  2. private static void updateFormula(Workbook wb,Sheet s,int row){
  1.  
  2. Row      r=s.getRow(row);
  1.  
  2. Cell c=null;
  1.  
  2. FormulaEcaluator eval=null;
  1.  
  2. if(wb instanceof HSSFWorkbook)
  1.  
  2. eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);
  1.  
  2. else if(wb instanceof XSSFWorkbook)
  1.  
  2. eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb);
  1.  
  2. for(int i=r.getFirstCellNum();i<r.getLastCellNum();i++){  
  3. c=r.getCell(i);  
  4. if(c.getCellType()==Cell.CELL_TYPE_FORMULA)     
  1.  
  2. eval.evaluateFormulaCell(c);     
  1.  
  2. }       
  3. }

說明:FormulaEvaluator提供了evaluateFormulaCell(Cell cell)方法,計算公式保存結果,但不改變公式。而evaluateInCell(Cell cell) 方法是計算公式,並將原公式替換爲計算結果,也就是說該單元格的類型不在是Cell.CELL_TYPE_FORMULA而是Cell.CELL_TYPE_NUMBERIC。HSSFFormulaEvaluator提供了靜態方法evaluateAllFormulaCells(HSSFWorkbook wb) ,計算一個Excel文件的所有公式,用起來很方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章