使用jxl需要導入對應jar包,maven下導入方式爲:
<dependency>
<groupId>jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6</version>
</dependency>
具體方法如下:
private static int maxRow = 60000;
/**
* 添加工作薄並導入數據
* @param workbook
* @param sheetData
* @param sheetIndex
* @throws IOException
* @throws RowsExceededException
* @throws WriteException
*/
public static int createSheet( WritableWorkbook workbook,ExcelSheetData sheetData,int sheetIndex) throws IOException, RowsExceededException, WriteException{
//添加工作薄
WritableSheet sheet = workbook.createSheet(sheetData.getName(), sheetIndex);
//單元格
Label label=null;
//給第一行設置列名
//第一行顏色
WritableCellFormat wcf = new WritableCellFormat();
wcf.setBackground(Colour.YELLOW);
wcf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);
//第一行固定添加編號
label=new Label(0,0,"編號",wcf);
sheet.addCell(label);
sheet.setColumnView(0,10);
for(int i=0;i<sheetData.getTitleList().size();i++){
label=new Label(i+1,0,sheetData.getTitleList().get(i).getName(),wcf);
//添加單元格
sheet.addCell(label);
sheet.setColumnView(i,sheetData.getTitleList().get(i).getWidth());
}
//導入數據
int row = 0;
for(int i=0;i<sheetData.getDataMapList().size();i++){
row++;
if (row>maxRow){//這裏,當數據條數大於6W時,爲防止數據溢出,將剩餘數據分到下一個工作薄以此類推
sheet = workbook.createSheet(sheetData.getName()+"_"+(i/65535+1), ++sheetIndex);
//第一行固定添加編號
label=new Label(0,0,"編號",wcf);
//添加單元格
sheet.addCell(label);
//設置單元格寬
sheet.setColumnView(0,10);
for(int j=0;j<sheetData.getTitleList().size();j++){
label=new Label(j+1,0,sheetData.getTitleList().get(j).getName(),wcf);
sheet.addCell(label);
sheet.setColumnView(j+1,sheetData.getTitleList().get(j).getWidth());
}
row = 1;
}
int dataIndex = 0;
label=new Label(0,row,(i+1)+"");
sheet.addCell(label);
for (Map.Entry<Integer,Object> dataMap : sheetData.getDataMapList().get(i).entrySet()) {
label=new Label(dataMap.getKey(),row,dataMap.getValue().toString());
sheet.addCell(label);
}
}
return sheetIndex;
}
這裏對數據條數進行檢查,如果數量過大則進行分工作薄處理
/**
* 通過文件方式生成excel並導出數據
* createExcelToFile(fileName,sheetDataList) 方法簡化,只生成單個工作薄時使用
* @param fileName 文件名稱
* @param sheetData 工作薄數據類
* @return
* @throws IOException
* @throws RowsExceededException
* @throws WriteException
*/
public static File createExcelOneSheetToFile(String fileName,ExcelSheetData sheetData) throws IOException, RowsExceededException, WriteException{
List<ExcelSheetData> sheetDataList = new ArrayList<ExcelSheetData>();
sheetDataList.add(sheetData);
return createExcelToFile(fileName,sheetDataList);
}
/**
* 通過文件方式生成excel並導出數據,可生成多個工作薄
* @param fileName 文件名
* @param sheetData 工作薄數據類
* @throws IOException
* @throws RowsExceededException
* @throws WriteException
*/
public static File createExcelToFile(String fileName, List<ExcelSheetData> sheetData) throws IOException, RowsExceededException, WriteException{
File file = new File(fileName);
//創建工作簿
WritableWorkbook workbook=Workbook.createWorkbook(file);
//創建sheet,設置第二三四..個sheet,依次類推即可
int sheetIndex = 0;
for (int i=0;i<sheetData.size();i++){
sheetIndex = createSheet(workbook,sheetData.get(i),sheetIndex);
sheetIndex++;
}
//寫入數據,一定記得寫入數據,不然你都開始懷疑世界了,excel裏面啥都沒有
workbook.write();
//最後一步,關閉工作簿
workbook.close();
return file;
}
jxl支持多工作簿導出,對開發也方便了許多。