java導出excel,每1000新建一個sheet

   前言

         首先接到這個功能開發的時候,第一個想法就是百度看看API,網上也提供了一些解決方法,但是都不完善,我是在網上資源的基礎之上,做的補充,修復了邏輯上的錯誤。

實現

         首先要實現這個功能,我們先要了解excel的api文檔,當然,如果快速開發,那你執行以下方法即可

        首先下載jxl-2.6.12.jar和jaudiotagger-2.0.3.jar    

       java代碼

package com.happydayin.util;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.write.*;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
// 稍後優化   2019-12-19  qzx
public class ExcelOperaation {
    public static void writeExcel(String path, List<String[]> list, String sheet, String[] title, int pageCount) {
        try {
            // 創建Excel工作薄
            WritableWorkbook wwb = null;
            // 新建立一個jxl文件
            OutputStream os = new FileOutputStream(path);
            wwb = Workbook.createWorkbook(os);
            // 添加第一個工作表並設置第一個Sheet的名字
//            WritableSheet sheets = wwb.createSheet(sheet, 1);

            //獲取List集合的size
            int totle = list.size();
            // 每個工作表格最多存儲5條數據(注:excel表格一個工作表可以存儲65536條)
            int mus = pageCount;
            //每頁記錄數
            int count=pageCount;
            // 應該創建多少頁
            int avg = totle / mus;
            // 設置初始數據大小
            int sum = 0;

            // 增加二維碼路徑轉存到excel中有3中情況
            if(totle<pageCount){ //1.list長度小於pageCount
                // 添加第一個工作表並設置第一個Sheet的名字
                WritableSheet sheets = wwb.createSheet("sheet1", 1);
                Label label;
                for (int i = 0; i < title.length; i++) {
                    // Label(x,y,z) 代表單元格的第x+1列,第y+1行, 內容z
                    // 在Label對象的子對象中指明單元格的位置和內容
                    // label = new Label(i, 0, title[i]);
                    label = new Label(i, 0, title[i], getHeader());
                    // 設置列寬
                    sheets.setColumnView(i, 30);
                    // sheets.setColumnView(4, 100);
                    // 將定義好的單元格添加到工作表中
                    sheets.addCell(label);
                }
                // 設置單元格屬性
                WritableCellFormat wc = new WritableCellFormat();
                // 設置居中
                wc.setAlignment(Alignment.CENTRE);
                // 設置邊框線
                wc.setBorder(Border.ALL, BorderLineStyle.THIN);

                for (int i = 0; i < list.size(); i++) {
                    String[] arrData = list.get(i);
                    for (int j = 0; j < arrData.length; j++) {
                        // 向特定單元格寫入數據
                        // sheets.setColumnView(j, 20);
                        label = new Label(j, 1 + i, arrData[j], wc);
                        sheets.addCell(label);
                    }
                }

            }else if(totle>pageCount){ //2.list的長度剛好可以整除pageCount
                if(totle%pageCount==0){  //整除
                    for (int s = 1; s <= avg ; s++) {
                        //創建一個可寫入的工作表
                        WritableSheet sheets = wwb.createSheet("sheet" + s, s);

                        // 設置列寬
                        Label label;
                        for (int i = 0; i < title.length; i++) {
                            // Label(x,y,z) 代表單元格的第x+1列,第y+1行, 內容z
                            // 在Label對象的子對象中指明單元格的位置和內容
                            // label = new Label(i, 0, title[i]);
                            label = new Label(i, 0, title[i], getHeader());
                            // 設置列寬
                            sheets.setColumnView(i, 30);
                            // sheets.setColumnView(4, 100);
                            // 將定義好的單元格添加到工作表中
                            sheets.addCell(label);
                        }

                        // 設置單元格屬性
                        WritableCellFormat wc = new WritableCellFormat();
                        // 設置居中
                        wc.setAlignment(Alignment.CENTRE);
                        // 設置邊框線
                        wc.setBorder(Border.ALL, BorderLineStyle.THIN);
                        // 填充數據
                        for (int i = sum; i < mus; i++) {
                            String[] arrData = list.get(i);
                            for (int j = 0; j < arrData.length; j++) {
                                // 向特定單元格寫入數據
                                // sheets.setColumnView(j, 20);
                                label = new Label(j, 1 + i-sum, arrData[j], wc);
                                sheets.addCell(label);
                            }
                        }
                        sum=mus;
                        mus=(s+1)*count;
                    }
                }else if(totle%pageCount>0){  //有餘數
                    int cou  = avg+1;  //因爲有餘數,所以sheet數量要加1
                    for (int s = 1; s <= cou ; s++) {
                        //創建一個可寫入的工作表
                        WritableSheet sheets = wwb.createSheet("sheet" + s, s);

                        // 設置列寬
                        Label label;
                        for (int i = 0; i < title.length; i++) {
                            // Label(x,y,z) 代表單元格的第x+1列,第y+1行, 內容z
                            // 在Label對象的子對象中指明單元格的位置和內容
                            // label = new Label(i, 0, title[i]);
                            label = new Label(i, 0, title[i], getHeader());
                            // 設置列寬
                            sheets.setColumnView(i, 30);
                            // sheets.setColumnView(4, 100);
                            // 將定義好的單元格添加到工作表中
                            sheets.addCell(label);
                        }

                        // 設置單元格屬性
                        WritableCellFormat wc = new WritableCellFormat();
                        // 設置居中
                        wc.setAlignment(Alignment.CENTRE);
                        // 設置邊框線
                        wc.setBorder(Border.ALL, BorderLineStyle.THIN);

                        if(s<cou){  //s小於cou,繼續走整除路線
                            // 填充數據
                            for (int i = sum; i < mus; i++) {
                                String[] arrData = list.get(i);
                                for (int j = 0; j < arrData.length; j++) {
                                    // 向特定單元格寫入數據
                                    // sheets.setColumnView(j, 20);
                                    label = new Label(j, 1 + i-sum, arrData[j], wc);
                                    sheets.addCell(label);
                                }
                            }
                            sum=mus;
                            mus=(s+1)*count;
                        }else if(s==cou){  //當s和cou相等時
                            // 取餘後的數據
                            int tot  = totle%pageCount+sum;
                            for (int i = sum; i < tot; i++) {
                                String[] arrData = list.get(i);
                                for (int j = 0; j < arrData.length; j++) {
                                    // 向特定單元格寫入數據
                                    // sheets.setColumnView(j, 20);
                                    label = new Label(j, 1 + i-sum, arrData[j], wc);
                                    sheets.addCell(label);
                                }
                            }
                            break;
                        }
                    }
                }

            }

            // 寫入數據
            wwb.write();
            // 關閉文件
            wwb.close();
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

    public static WritableCellFormat getHeader() {
        // 定義字體
        WritableFont font = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD);
        try {
            // 黑色字體
            font.setColour(jxl.format.Colour.BLACK);
        }
        catch (WriteException e1) {
            e1.printStackTrace();
        }
        WritableCellFormat format = new WritableCellFormat(font);
        try {
            // 左右居中
            format.setAlignment(jxl.format.Alignment.CENTRE);
            // 上下居中
            format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
            // 黑色邊框
            format.setBorder(Border.ALL, BorderLineStyle.THIN, jxl.format.Colour.BLACK);
            // 黃色背景
            format.setBackground(jxl.format.Colour.YELLOW);
        }
        catch (WriteException e) {
            e.printStackTrace();
        }
        return format;
    }


    public static void main(String args[]) {
        ExcelOperaation excel = new ExcelOperaation();
        // 文件保存路徑
        String path = "D:/test.xls";
        // 準備測試數據   這邊傳完整的數據,然後excel做分sheet操作
        List<String[]> list = new ArrayList<>();
        for (int i = 1; i <=2045 ; i++) {
            String content[] = { i + "", "測試","測試" };
            list.add(content);
        }

        // sheet頁名稱
        String sheet = "100";
        // 列名
        String title[] = { "id", "content","思想" };
        excel.writeExcel(path, list, sheet, title,1000);
    }
}

如上代碼即可.在實際開發時,只要將參數轉換爲動態的即可

上述代碼在判斷寫入sheet時,做了判斷,判斷邏輯是
1、當總數可以整除每頁記錄數時

2、當總數不能整除記錄數

3、當總數小於記錄數


 

 


 

 

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