java poi 讀取本地文件和導出到本地


閑來無事簡單寫了一個poi讀取本地文件然后導出 excel的單元測試。沒有設置excel的格式和設置合並單元格,如果有需要的可以去網上找下,並不難。

好的一步一步的放代碼。

首先是單元測試方法也是程序的入口 。

    @Test
    public void downloadTest(){
        //讀取文件
        String path = "C:\\Users\\Administrator\\Desktop\\counterTemplate.xlsx";
        List<String[]> list = readFile(path);
        if (list != null) {
            //列名
            String[] fields = new String[]{"journal","publisher","platform","printISSN","onlineISSN","reportingPeriodTotal",
                    "reportingPeriodHTML","reportingPeriodPDF","jan","feb",
                    "mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};

            //寫出文件
            String outPath ="E:\\demo\\counterTemplate導出模板.xlsx";
            writerExcel(list, fields, outPath);
        }
    }

  然后readFile 是抽取的讀取文件方法。對了,因為我讀取的本地文件是只有string 和 number 類型的值,所以只對這兩個單元格類型進行了判斷如果有其它的類型還需要進行判斷。單元格類型的數值cellType 是poi Cell.java定義好的只需要進入到Cell.java類里面去看他的屬性值就知道對應的什么值了。

  其中有一點點不太好的地方是獲取numer的單元格類型值時會有小數點。我沒有找到好的方法去轉換。所以就偷懶用String的截取方法截取了"."前面的部分。如果有朋友有更好的方法可以留言交流下。

   /**
     * 根據文件路徑讀取文件返回文件內容數據
     * @param path
     * @return
     */
    private  List<String[]> readFile(String path) {
        File file = new File(path);
        InputStream is =null;
        if (file.exists()) {
            //將file 轉換成MultipartFile
            try{
                MultipartFile mf = new MockMultipartFile(file.getName(),new FileInputStream(file));
                is = mf.getInputStream();
                //獲取文件名
                //String fileName = mf.getOriginalFilename(); 獲取原始文件名。在單元測試中值是空的。可能不是通過頁面上傳獲取到的文件。
                String fileName = mf.getName();

                Workbook workbook = null;
                if (fileName.endsWith("xls")){
                    workbook = new HSSFWorkbook(is);
                } else if(fileName.endsWith("xlsx")){
                    workbook = new XSSFWorkbook(is);
                } else {
                    System.out.println("workBoot 創建失敗");
                }
                //獲得當前頁
                Sheet sheet = workbook.getSheetAt(0);
                //容器
                List<String[]> list = new ArrayList<>();

                //遍歷獲取每行
                int firstRowNum = sheet.getFirstRowNum();
                int lastRowNum = sheet.getLastRowNum();
                for (int i =firstRowNum+1;i <= lastRowNum;i++) {
                    Row row = sheet.getRow(i);
                    int lastCellNum = row.getLastCellNum();
                    //遍歷每行獲取每列的數據
                    String[] cells = new String[lastCellNum];
                    for (int j = 0; j < lastCellNum; j++) {
                        Cell cell = row.getCell(j);
                        String value = "";
                        if (cell != null) {
                            int cellType = cell.getCellType();
                            //判斷單元格value 調用不同的返回值獲取數據
                            switch (cellType) {
                                case 0:
                                    double numericCellValue = cell.getNumericCellValue();

                                    value = String.valueOf(numericCellValue);
                                    value = value.substring(0,value.lastIndexOf("."));
                                    break;
                                case 1:
                                    value = cell.getStringCellValue();
                                    break;
                            }
                        }
                        cells[j]=value;
                    }
                    list.add(cells);
                }
                return list;
            } catch (Exception  e){
                System.out.println("文件轉換出錯");
                e.printStackTrace();
            } finally {
               if (is != null) {
                    try {
                        is.close();
                    } catch (Exception e){
                        System.out.println("輸入流關閉異常");
                    }
               }
            }
            return null;
        }else{
            System.out.println("文件不存在");
            return null;
        }
    }

   writerExcel是寫出到本地的方法。

 1    /**
 2      * 根據路徑寫出文件到本地
 3      * @param list
 4      * @param fields
 5      * @param outPath
 6      */
 7     private void writerExcel(List<String[]> list, String[] fields, String outPath) {
 8         Workbook workbook = new XSSFWorkbook();
 9         Sheet sheet = workbook.createSheet("用戶中心_數據庫管理_數據庫列表_counter報告_ACS數");
10         //標題行
11         Row titleRow = sheet.createRow(0);
12         for (int i = 0; i < fields.length;i++) {
13             Cell cell = titleRow.createCell(i);
14             String field = fields[i];
15             cell.setCellValue(field);
16         }
17         //設置數據列
18         for (int i = 1;i<list.size();i++) {
19             String[] data = list.get(i);
20             //數據行
21             Row dataRow = sheet.createRow(i);
22             if (data != null) {
23                 for (int j = 0;j<data.length;j++) {
24                     String value = data[j];
25                     Cell cell = dataRow.createCell(j);
26                     cell.setCellValue(value);
27                 }
28             }
29         }
30         //設置頭信息
31         OutputStream os = null;
32         try {
33             //根據路徑創建輸出流
34             //如果是在controller里可以使用reponse.getOutputStream()方法獲取輸出流
35             os = new FileOutputStream(outPath);
36             workbook.write(os);
37         } catch (Exception e) {
38             System.out.println("導出出錯");
39             e.printStackTrace();
40         }finally {
41             try {
42                 if (os != null) {
43                     os.close();
44                 }
45                 workbook.close();
46             } catch (Exception e) {
47                 System.out.println("workbook 流關閉失敗");
48             }
49         }
50     }

 


免責聲明!

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



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