前言
首先接到這個功能開發的時候,第一個想法就是百度看看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、當總數小於記錄數