POI 的使用


一、 POI簡介

Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。.NET的開發人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。

二、POI結構說明

包名稱說明

HSSF提供讀寫Microsoft Excel XLS格式檔案的功能。

XSSF提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。

HWPF提供讀寫Microsoft Word DOC格式檔案的功能。

HSLF提供讀寫Microsoft PowerPoint格式檔案的功能。

HDGF提供讀Microsoft Visio格式檔案的功能。

HPBF提供讀Microsoft Publisher格式檔案的功能。

HSMF提供讀Microsoft Outlook格式檔案的功能。

三、 EXCEL常用操作方法

1、 得到Excel常用對象

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

2、建立Excel常用對象

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet");

HSSFRow row = sheet.createRow((short)0); 
HSSFCell cell = sheet.createCell((short)0); 
cellStyle = wb.createCellStyle(); 
//指定單元格樣式和值
cell.setCellStyle(cellStyle); 
cell.setCellValue(1);

3、sheet相關

//設置sheet名稱
wb.setSheetName(0, "12" + "月合同到期");
//取得sheet的數目 
wb.getNumberOfSheets() 
//新建名稱為Output的sheet
HSSFSheet sheet = wb.createSheet("Output"); 
//根據index取得sheet對象
HSSFSheet sheet = wb.getSheetAt(0); 
//選中指定的工作表
sheet.setSelected(true);

4、有效的行,單元格個數

//取得有效的行數
int rowcount = sheet.getLastRowNum();
//取得一行的有效單元格個數
row.getLastCellNum();

5、單元格值類型讀寫

//根據單元格不同屬性返回字符串數值
public String getCellStringValue(HSSFCell cell) { 
String cellValue = ""; 
switch (cell.getCellType()) { 
case HSSFCell.CELL_TYPE_STRING://字符串類型 
cellValue = cell.getStringCellValue(); 
if(cellValue.trim().equals("")||cellValue.trim().length()<=0) 
cellValue=" "; 
break; 
case HSSFCell.CELL_TYPE_NUMERIC: //數值類型 
cellValue = String.valueOf(cell.getNumericCellValue()); 
break; 
case HSSFCell.CELL_TYPE_FORMULA: //公式 
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); 
cellValue = String.valueOf(cell.getNumericCellValue()); 
break; 
case HSSFCell.CELL_TYPE_BLANK: 
cellValue=" "; 
break; 
case HSSFCell.CELL_TYPE_BOOLEAN: 
break; 
case HSSFCell.CELL_TYPE_ERROR: 
break; 
default: 
break; 
} 
return cellValue; 
}


//設置單元格為STRING類型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//設置單元格的值---有重載
cell.setCellValue(value);

6、設置列寬、行高

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

//POI設置自適應列寬
sheet.autoSizeColumn(i); (版本不能太老) sheet.autoSizeColumn(i,
true);(合並的單元格使用) sheet.setColumnWidth(i, “列名”.getBytes().length*2*256);(中文適用) 公式單元格自適應的是公式,將值算出后再設置: HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook()); CellValue cell71Val = evaluator.evaluate(cell71); cell71.setCellValue(cell71Val.getNumberValue());

 

//調整單元格寬度
sheet.setAutobreaks(true);
sheet.setColumnWidth((short)i,colsWidth[i]); //設定單元格長度
sheet.autoSizeColumn((short) i);//自動根據長度調整單元格長度

7、添加區域,合並單元格

//合並從第rowFrom行columnFrom列 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo ,(short)columnTo);
sheet.addMergedRegion(region);// 到rowTo行columnTo的區域
// 獲得一個 sheet 中合並單元格的數量
int sheetmergerCount = sheet.getNumMergedRegions();


8、常用單元格邊框格式
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下邊框
style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左邊框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框

     其中邊框類型分為以下幾種:

邊框范例圖

對應的靜態值

HSSFCellStyle. BORDER_DOTTED

HSSFCellStyle. BORDER_HAIR

HSSFCellStyle. BORDER_DASH_DOT_DOT

HSSFCellStyle. BORDER_DASH_DOT

HSSFCellStyle. BORDER_DASHED

HSSFCellStyle. BORDER_THIN

HSSFCellStyle. BORDER_MEDIUM_DASH_DOT_DOT

HSSFCellStyle. BORDER_SLANTED_DASH_DOT

HSSFCellStyle. BORDER_MEDIUM_DASH_DOT

HSSFCellStyle. BORDER_MEDIUM_DASHED

HSSFCellStyle. BORDER_MEDIUM

HSSFCellStyle. BORDER_THICK

HSSFCellStyle. BORDER_DOUBLE

 

9、設置字體和內容位置

HSSFFont font = wb.createFont();

font.setFontName("華文行楷");//設置字體名稱
font.setFontHeightInPoints((short) 11);                    //字號 
font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); //加粗 
font.setColor(HSSFColor.RED.index);               //設置字體顏色
font.setUnderline(FontFormatting.U_SINGLE);  //設置下划線
font.setTypeOffset(FontFormatting.SS_SUPER);//設置上標下標
font.setStrikeout(true);                                   //設置刪除線
style.setFont(font); 

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 
style.setRotation(short rotation);//單元格內容的旋轉的角度 
Style.setWrapText(true); //設置excel單元格中的內容換行
HSSFDataFormat df = wb.createDataFormat(); 
style1.setDataFormat(df.getFormat("0.00%"));//設置單元格數據格式 
cell.setCellStyle(style);

 

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

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

 


11、填充和顏色設置

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

 


12、工作表的放大縮小
sheet.setZoom(1,2); // 50 percent magnification
sheet.setZoom(75); //75% scale


13. 使用公式
cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula("SUM(C2:C3)" ); //給單元格設公式  



14. 設置超鏈接
cell.setCellFormula("hyperlink(\"http://www.yiibai.com/testng/\",\"testng\")");


15、插入圖片

    public static void test1(){
        
        FileOutputStream fileOut = null;     
        BufferedImage bufferImg = null;     
       try {  
           ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();  
         //加載圖片  
           bufferImg = ImageIO.read(new File(picture));     
           ImageIO.write(bufferImg, "jpg", byteArrayOut);  
           HSSFWorkbook wb = new HSSFWorkbook();     
           HSSFSheet sheet = wb.createSheet("sheet1");    
           
           HSSFPatriarch patriarch = sheet.createDrawingPatriarch();     
              HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)4,37);    
           //插入圖片 1   
           patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));      
           //圖片2  
           anchor = new HSSFClientAnchor(500, 0, 0, 0,(short) 5, 1, (short) 9, 38);  
           patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));  
           fileOut = new FileOutputStream( filepath+"/excel.xls");     
           // 輸出文件   
            wb.write(fileOut);  
            System.out.println("test1");
       } catch (Exception e) {  
           e.printStackTrace();  
       }          
    }  
    
    
    public static void test3(){
        
        FileOutputStream fileOut = null;     
        BufferedImage bufferImg = null;     
       try {  
           ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();  
         //加載圖片  
           bufferImg = ImageIO.read(new File(picture));     
           ImageIO.write(bufferImg, "jpg", byteArrayOut);  
           XSSFWorkbook wb = new XSSFWorkbook();     
           XSSFSheet sheet1 = wb.createSheet("sheet1");    
           XSSFDrawing drawing = sheet1.createDrawingPatriarch();     
              XSSFClientAnchor anchor = new XSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);          
           //插入圖片 1   
              drawing.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));      
           fileOut = new FileOutputStream( filepath+ "/excel2.xlsx");     
           // 輸出文件   
            wb.write(fileOut);  
            System.out.println("test3");
       } catch (Exception e) {  
           e.printStackTrace();  
       }          
    }  

 

16. 從Excel文件提取圖片

    public static void testread(){
        InputStream inp;
        try {
            inp = new FileInputStream(filepath+"/excel.xls");
            HSSFWorkbook workbook = new HSSFWorkbook(inp);//讀取現有的Excel文件
            List<HSSFPictureData> pictures = workbook.getAllPictures();
            for(int i=0;i<pictures.size();i++){
                HSSFPictureData pic=pictures.get(i);
                String ext = pic.suggestFileExtension();
                if (ext.equals("jpeg"))//判斷文件格式,依照實際圖片格式設置
                {
                    FileOutputStream png=new FileOutputStream(filepath +"\\Apache.jpg");
                    png.write(pic.getData());
                    png.close();//保存圖片
                    System.out.println("test11");
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

 

POI CellType類型

CellType 類型 值
CELL_TYPE_NUMERIC 數值型 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布爾型 4
CELL_TYPE_ERROR 錯誤 5

使用POI讀取單元格的數據有兩種方式:

1.通過setCellType將單元格類型設置為字符串,然后通過getRichStringCellValue讀取該單元格數據,然后將讀取到的字符串轉換為對應的類型,

2.通過getCellType獲取單元格類型,然后通過對應的getcellvalue 方法讀取該單元格數據,如:getNumericCellValue

 

對應POI版本(poi-bin-3.17-20170915.tar.gz)

 

Maven artifactId Prerequisites JAR
poi commons-logging, commons-codec, log4j poi-version-yyyymmdd.jar
poi-scratchpad poi poi-scratchpad-version-yyyymmdd.jar
poi-ooxml poi, poi-ooxml-schemas poi-ooxml-version-yyyymmdd.jar
poi-ooxml-schemas xmlbeans poi-ooxml-schemas-version-yyyymmdd.jar
poi-examples poi, poi-scratchpad, poi-ooxml poi-examples-version-yyyymmdd.jar
ooxml-schemas xmlbeans ooxml-schemas-1.1.jar

其他參考鏈接:https://www.cnblogs.com/huajiezh/p/5467821.html


免責聲明!

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



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