日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Java使用POI导出excel(上)——基本操作

發布時間:2024/5/24 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 Java使用POI导出excel(上)——基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  相關的介紹參考自:http://zc985552943.iteye.com/blog/1491546

一、概述

  1.概念

  受上文博文博主的啟發,有必要先對excel的各個概念先做了解!

//上述基本都是接口

//一個excel表格
        HSSFWorkbook wb = new HSSFWorkbook();
        //一個工作表格(sheet)
        HSSFSheet sheet = wb.createSheet("sheet1");
        //一行(row)
        HSSFRow row = sheet.createRow(0);
        //一個單元格(cell)
        HSSFCell cell = row.createCell(0);
        //單元格樣式(cellStyle)
        HSSFCellStyle cellStyle = wb.createCellStyle();
        //單元格內容樣式(dataFormat)
        HSSFDataFormat format = wb.createDataFormat();

View Code

  2.POI簡介

     官網:http://poi.apache.org/

    官方API:http://poi.apache.org/apidocs/index.html

    (韓國的JExcel這里暫不介紹)

    是什么?(引用官網介紹)

    

    能干什么?

    這里我們介紹導出excel的功能操作

   怎么干?

    我們這里先介紹HSSF的使用。

    這里最主要的熟悉里面那一套接口

  需要環境:這里使用POI3.9的版本(這個版本更新比較快)

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

View Code

  推薦版本單獨管理的maven依賴寫法:

<poi.version>3.9</poi.version>

二、基本使用(HelloWorld)

  1.創建工作簿

 public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //使用工作簿的write()方法向文件輸出工作簿
        FileOutputStream out = new FileOutputStream("E:\1.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

  

  2.創建sheet頁

 public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //創建兩個sheet頁
        wb.createSheet("sheet1");
        wb.createSheet("sheet2");
        //創建流并將wb輸出
        FileOutputStream out = new FileOutputStream("E:\2.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

  3.創建行和單元格

  excel中行的概念:(單元格即為行的每一個元素)

  

public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //創建sheet頁(使用的是帶參構造器)
        Sheet sheet = wb.createSheet("sheet01");
        //創建行(從0開始)
        Row row = sheet.createRow(0);
        //創建單元格(第一列)
        Cell cell = row.createCell(0);
        //給單元格賦值
        cell.setCellValue("測試單元格內容");
        //創建流并將wb輸出
        FileOutputStream out = new FileOutputStream("E:\3.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

  

  單元格創建其他值的示例

 public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //創建sheet頁(使用的是帶參構造器)
        Sheet sheet = wb.createSheet("sheet01");
        //創建行(從0開始)
        Row row = sheet.createRow(0);
        //創建單元格(第一列)
        Cell cell = row.createCell(0);
        //給單元格賦值
        cell.setCellValue("測試單元格內容");
        //測試其他的賦值方式
        row.createCell(1).setCellValue(1.1);    //第二列賦浮點值
        row.createCell(2).setCellValue(false);  //第三列賦值boolean型
        //創建流并將wb輸出
        FileOutputStream out = new FileOutputStream("E:\4.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

三、單元格數據格式

  1.時間樣式單元格

 public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //創建sheet頁(使用的是帶參構造器)
        Sheet sheet = wb.createSheet("sheet01");
        //創建行(從0開始)
        Row row = sheet.createRow(0);
        //創建單元格(第一列)
        Cell cell = row.createCell(0);
        //給單元格賦值
        cell.setCellValue(new Date());
        //創建流并將wb輸出
        FileOutputStream out = new FileOutputStream("E:\1.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

  效果:

  //可以看到,是一個長整形

 調整為時間樣式:

 public static void main(String[] args) throws IOException {
        //創建工作簿 (使用了多態特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //創建sheet頁(使用的是帶參構造器)
        Sheet sheet = wb.createSheet("sheet01");
        //創建行(從0開始)
        Row row = sheet.createRow(0);
        //創建單元格(第一列)
        Cell cell = row.createCell(0);
        //給單元格賦值
        cell.setCellValue(new Date());
        /*
         * ==========時間樣式單元格==============
         */
        // CreationHelper 可以理解為一個工具類,由這個工具類可以獲得 日期格式化的一個實例
        CreationHelper creationHelper = wb.getCreationHelper();
        //創建單元格樣式類
        CellStyle cellStyle = wb.createCellStyle();
        //設置時間樣式
        cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
        //給第一行第二列賦值
        Cell cell2 = row.createCell(1);
        cell2.setCellValue(new Date());
        cell2.setCellStyle(cellStyle);
        //創建流并將wb輸出
        FileOutputStream out = new FileOutputStream("E:\2.xls");
        wb.write(out);
        //流的關閉
        out.close();
    }

  

  2.處理不同類型內容:

public static void main(String[] args) throws IOException {
    Workbook wb = new HSSFWorkbook();
    Sheet sheet1 = wb.createSheet("三年級(1)班學生名單");
    Row row = sheet1.createRow(0);
    row.createCell(0).setCellValue(1);
    row.createCell(1).setCellValue("一個字符串");
    row.createCell(2).setCellValue(true);
    row.createCell(3).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
    row.createCell(4).setCellValue(false);
    FileOutputStream fos = new FileOutputStream(
            "c:\POI使用FileOutputStream輸出流生成的工作簿.xls");
    wb.write(fos);
    fos.close();
    // wb 是需要關閉的,否則編譯器會有提示
    wb.close();
}

//突如其來的斷點防不勝防,這里這個示例是借的網友的

  3.遍歷內容

public static void main(String[] args) throws IOException {
       //通過輸入流獲取工作簿
       InputStream in = new FileInputStream("E:\1.xls");
       //(以下直接使用的是類而不是接口,因為類有實現還有自己的方法,更加強大)
       POIFSFileSystem fs = new POIFSFileSystem(in);
       HSSFWorkbook wb = new HSSFWorkbook(fs);
       HSSFSheet hssfSheet = wb.getSheetAt(0);  //獲取第一個sheet頁
      
       if(hssfSheet == null){   //sheet頁不存在,不做處理
           return;
       }
       //遍歷行
       for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
           HSSFRow hssfRow = hssfSheet.getRow(rowNum);
           if(hssfRow == null){ //空處理
               continue;
           }
           //遍歷列
           for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){
               HSSFCell hssfCell = hssfRow.getCell(cellNum);
               if(hssfCell == null){    //空處理
                   continue;
               }
               System.out.print(getCellValue(hssfCell)+"    ");
           }
           System.out.println();
       }
    }
    
    /**
     * 封裝的類型轉換處理靜態方法
     */
    private static String getCellValue(HSSFCell hssfCell){
        if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
            return String.valueOf(hssfCell.getBooleanCellValue());
        } else if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
            return String.valueOf(hssfCell.getNumericCellValue());
        } else{
            return String.valueOf(hssfCell.getStringCellValue());
        }
    }

 網友的switch版本:

  private static String getCellDate(Cell cell) {
        String return_string = null;
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            return_string = cell.getStringCellValue();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
            return_string = cell.getNumericCellValue() + "";
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            return_string = String.valueOf(cell.getBooleanCellValue());
        default:
            return_string = "";
            break;
        }
        return return_string;
    }

View Code

   

  

  //時間樣式遍歷待更新

  4.文本提取

public static void main(String[] args) throws IOException {
       //通過輸入流獲取工作簿
       InputStream in = new FileInputStream("E:\1.xls");
       //(以下直接使用的是類而不是接口,因為類有實現還有自己的方法,更加強大)
       POIFSFileSystem fs = new POIFSFileSystem(in);
       HSSFWorkbook wb = new HSSFWorkbook(fs);
       
       ExcelExtractor excelExtractor = new ExcelExtractor(wb);
       //抽取文本輸出
       System.out.println(excelExtractor.getText());
    in.close(); }

//這里使用的是實現類,導包如下:

import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

  

  //可以去掉sheet頁名字

     ExcelExtractor excelExtractor = new ExcelExtractor(wb);
       excelExtractor.setIncludeSheetNames(false);
       //抽取文本輸出
       System.out.println(excelExtractor.getText());

四、單元格設置對齊、邊框、合并等樣式

  1.單元格對齊方式

 public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
        Row row = sheet1.createRow(2);  //創建第3行
        row.setHeightInPoints(30);  //設置行高(可參見API等 )
        //調用封裝的方法,創建單元格     (樣式均是常量)
        Cell cell1 = createCell(wb, row, (short)0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM); //使用short足夠
        cell1.setCellValue("操作Excel");
        Cell cell2= createCell(wb, row, (short)1, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_TOP); //使用short足夠
        cell2.setCellValue("操作Excel");
        FileOutputStream fos = new FileOutputStream("E:\5.xls");
        wb.write(fos);
        fos.close();
    }

  封裝的私有方法:(請重視封裝

 private static Cell createCell(Workbook wb,Row row,short column,short hailgn,short valign){
        Cell cell = row.createCell(column); //創建單元格
        cell.setCellValue(new HSSFRichTextString("富文本區域")); //字符串可以使用此方式
        //創建并設置樣式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(hailgn); //水平方向
        cellStyle.setVerticalAlignment(valign); //垂直方向
        //設置單元格樣式
        cell.setCellStyle(cellStyle);
        return cell;
    }

  效果:

  其他樣式請自行探索或根據文首文檔查看。

  2.邊框處理

public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
        Row row = sheet1.createRow(1);  //創建第2行
       
        Cell cell = row.createCell(1);  //創建第二列
        cell.setCellValue("666");
        //單元格樣式
        CellStyle cellStyle = wb.createCellStyle();
        //同樣,通過常量進行設置
        cellStyle.setBorderBottom(CellStyle.BORDER_THIN);   //底部邊框樣式
        //通過顏色索引設置底部顏色
        cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //底部邊框顏色
       
        //同理,設置左邊樣式
        cellStyle.setBorderLeft(CellStyle.BORDER_THICK);    //左邊邊框樣式
        cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());    //左邊邊框顏色
        
        //同理,設置右邊樣式
        cellStyle.setBorderRight(CellStyle.BORDER_DASHED);
        cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex());
        //最后,設置頂部樣式
        cellStyle.setBorderTop(CellStyle.BORDER_THIN);
        cellStyle.setTopBorderColor(IndexedColors.BROWN.getIndex());
        
        //注入樣式
        cell.setCellStyle(cellStyle);
        FileOutputStream fos = new FileOutputStream("E:\6.xls");
        wb.write(fos);
        fos.close();
    }

  效果:

  3.單元格填充色和顏色操作

public static void main(String[] args) throws IOException {
        //創建工作簿和sheet頁
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow(1);  //創建第2行
        Cell cell = row.createCell(1);  //創建第2列
        cell.setCellValue("777");
        
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());   //背景色
        cellStyle.setFillPattern(CellStyle.BIG_SPOTS);   //帶點的效果
        
        //注入樣式
        cell.setCellStyle(cellStyle);
        
        Cell cell2 = row.createCell(2);  //創建第2列
        cell2.setCellValue("777");
        
        CellStyle cellStyle2 = wb.createCellStyle();
        cellStyle2.setFillForegroundColor(IndexedColors.BLUE.getIndex());   //前景色
        cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND);
        //注入樣式
        cell2.setCellStyle(cellStyle2);
        FileOutputStream fos = new FileOutputStream("E:\7.xls");
        wb.write(fos);
        fos.close();
    }

  單元格顏色樣式背景色未正確顯示,待更新:

  4.單元格合并

 public static void main(String[] args) throws IOException {
        //創建工作簿和sheet頁
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow(1);  //創建第2行
        Cell cell = row.createCell(1);  //創建第2列
        cell.setCellValue("單元格合并測試");
        
        //單元格合并是由sheet來控制的,cell是無法控制合并的(只能管自己的樣式)
        //四個參數:起始結束行;起始結束列(注意都是從0開始)
        sheet1.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
       
        FileOutputStream fos = new FileOutputStream("E:\8.xls");
        wb.write(fos);
        fos.close();
    }

  效果:

  進一步測試合并4個單元格

sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));

  效果:

五、操作excel的其他處理

  1.字體處理

 public static void main(String[] args) throws IOException {
        //創建工作簿和sheet頁
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow((short)1);  //創建第2行
       
        //創建字體處理類
        Font font = wb.createFont();
        //設置字體相關樣式
        font.setFontHeightInPoints((short)24); //設置高度
        font.setFontName("Courier New"); //設置字體名字(官方demo的寬體字體)
        font.setItalic(true);   //設置是否斜體
        font.setStrikeout(true);    //一種中間帶線的樣式(類似刪除線),見效果
        
        //創建cellStyle,font是style中的一個樣式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setFont(font);
        
        Cell cell = row.createCell((short)1);
        cell.setCellValue("單元格字體測試");
        
        //注入樣式
        cell.setCellStyle(cellStyle);
        FileOutputStream fos = new FileOutputStream("E:\1.xls");
        wb.write(fos);
        fos.close();
    }

  2.讀取和重寫工作簿

 public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream("E:\1.xls");
        //通過輸入流,得到工作簿
        POIFSFileSystem fs = new POIFSFileSystem(in);
        Workbook wb = new HSSFWorkbook(fs);
        //通過下標獲取sheet頁
        Sheet sheet1 = wb.getSheetAt(0);
   
        Row row = sheet1.getRow(1); //獲取第一行
        Cell cell = row.getCell(0); //獲取第一個單元格
        if(cell == null){   //為 Null則新建一個
            cell = row.createCell(3);
        }
        cell.setCellType(Cell.CELL_TYPE_STRING);
        cell.setCellValue("測試讀取重寫");
        FileOutputStream fos = new FileOutputStream("E:\1.xls");
        //重新寫回原處
        wb.write(fos);
        fos.close();
    }

  //如報錯,應該是excel文件被占用,退出文件占用即可

  效果:

  3.單元格使用換行

  如何在excel中換行呢?——使用 alt+enter

  

 public static void main(String[] args) throws IOException {
       //創建sheet頁
       Workbook wb = new HSSFWorkbook();
       Sheet sheet1 = wb.createSheet("sheet1");
       
       //創建單元格
       Row row = sheet1.createRow(1);
       Cell cell = row.createCell(1);
       
       cell.setCellValue("即將換行 
 換行成功");
       
       //通過樣式設置允許換行
       CellStyle cellStyle = wb.createCellStyle();
       cellStyle.setWrapText(true); //允許換行
       
       cell.setCellStyle(cellStyle);
       
       //調整行高(2倍默認行高)
       row.setHeightInPoints(2*sheet1.getDefaultRowHeightInPoints());
       //調整寬度,詳見API
       sheet1.autoSizeColumn(2);
       
       FileOutputStream fos = new FileOutputStream("E:\2.xls");
       wb.write(fos);
       fos.close();
    }

  效果:

  4.創建用戶自定義數據格式

public static void main(String[] args) throws IOException {
       //創建sheet頁
       Workbook wb = new HSSFWorkbook();
       Sheet sheet1 = wb.createSheet("sheet1");
       
       //數據格式屬于style里的,類似字體
       DataFormat format = wb.createDataFormat();
       
       //定義
       CellStyle cellStyle;
       Row row;
       Cell cell;
       short rowNum = 0;
       short cellNum = 0;
       
       //創建
       row = sheet1.createRow(rowNum++);
       cell = row.createCell(cellNum++);
       
       cell.setCellValue(10086.258);
      
       cellStyle = wb.createCellStyle();
       cellStyle.setDataFormat(format.getFormat("0.0"));    //設置數據格式
       
       //注入樣式
       cell.setCellStyle(cellStyle);
       //=========================
      
       row = sheet1.createRow(rowNum++);
       cell = row.createCell(cellNum++);
       
       cell.setCellValue(3456789.258);
      
       cellStyle = wb.createCellStyle();
       cellStyle.setDataFormat(format.getFormat("#,##0.000"));    //設置數據格式
       //注入樣式
       cell.setCellStyle(cellStyle);
       
       FileOutputStream fos = new FileOutputStream("E:\3.xls");
       wb.write(fos);
       fos.close();
    }

  //定義與創建分離的寫法(推薦)

  效果:

  其中,0.0為保留一位小數,自動四舍五入了

  第二個為3位3位按逗號分隔

總結

以上是生活随笔為你收集整理的Java使用POI导出excel(上)——基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。