java通過JXL寫Excel
一.JXL概述
在java中,使用jxl操作excel是一個很不錯的選擇,當然你也可以選擇POI之類的,個人感覺POI比較重,jxl在的API在使用邏輯和易操作性上都很不錯,但是jxl在功能上沒有POI強大,對於圖形和圖表的識別能力有限
二.下面是一個使用JXL寫的一個工具類(可用於簡單的匯出功能)
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import org.apache.log4j.Logger;
@SuppressWarnings("unchecked")
public class ExcelExportor {
private static Logger log=Logger.getLogger(ExcelExportor.class);
// 建立excel的工作區域
private WritableWorkbook wwb;
// 建立excel工作區域中的頁面
private WritableSheet ws;
// 設定單元格的字型樣式
private WritableFont wf = new WritableFont(WritableFont.ARIAL, 14,
WritableFont.BOLD);
// 初始化格式化類
private WritableCellFormat wcf = new WritableCellFormat(wf);
private OutputStream os;
private ExcelExportor(OutputStream os){
this.os=os;
}
public static ExcelExportor getInstance(HttpServletResponse response,String fileName){
ServletOutputStream sos=null;
try{
response.reset();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
sos=response.getOutputStream();
}catch(Exception ex){
ex.printStackTrace();
log.error(ex.getMessage());
}
return new ExcelExportor(sos);
}
public static ExcelExportor getInstance(OutputStream os){
return new ExcelExportor(os);
}
public
export(data,null,null);
}
public
export(data,header,null);
}
/**
*
* @param data 需要匯出的資料,為List型別,可以為Bean也可以為Map型別
* @param header Map或Bean對應的欄位名資料格式為
* {{"欄位名1","中文名1"},{"欄位名2","中文名2"},{"欄位名3","中文名3"}}
* @param sheetName 匯出excel時下面頁籤的名稱
* @throws Exception
*/
public
// 設定生成excel後匯出的流類
wwb = Workbook.createWorkbook(os);
Map datas=new HashMap();datas.put("sheet1",data);
Map headers=new HashMap();headers.put("sheet1",header);
Map steetNames=new HashMap();steetNames.put("sheet1",sheetName);
export(datas, headers, steetNames);
}
/**
* list中存放的物件可以是bean也可以是Map型別的物件 header為設定excel的標題頭部
*
* @param list
* @param header
* @return
* @throws Exception
*/
public
throws Exception {
Set keys=datas.keySet();
Iterator it=keys.iterator();
long start=System.currentTimeMillis();
while(it.hasNext()){
String key=it.next().toString();
//根據key獲取sheetName
String sheetName=(String)steetNames.get(key);
//根據key獲取需要匯出的資料集合
List list=(List)datas.get(key);
//根據key獲取需要匯出的header名稱
String[][] header=(String[][])headers.get(key);
if(sheetName==null||sheetName.equals("")){
log.warn(key+"所對應的sheetName未設定,預設使用"+key+"的名稱!");
sheetName=key;
}
ws = wwb.createSheet(sheetName, 1);
if (list == null||list.size()==0){
log.warn(key+"所對應的資料集合為空!");
continue;
}
if(header==null){
log.warn(key+"所對應的header未設定,預設使用欄位名做匯出標題");
}
if (list.get(0) instanceof Map)
praseMap(list, header);
else
praseBean(list, header);
}
long end=System.currentTimeMillis();
log.info("匯出資料總共耗時:"+(end-start)+"ms");
wwb.write();
wwb.close();
}
// 解析生成型別為Map型別的excel
// 如果不設定頭部,預設使用鍵值,like:{{'key1','標題1'},{'key2','標題2'},....}
private
for (int i = 0; i < list.size(); i++) {
Map map = (Map) list.get(i);
Set keyset = map.keySet();
Object[] keys = keyset.toArray();
//生成Excel的標題部分......................
if (i == 0) {
if(header==null)
for (int j = 0; j < keys.length; j++) {
Label cell = new Label(j, i, keys[j]==null?"":keys[j].toString(), wcf);
ws.addCell(cell);
}
// 用自定義的列名覆蓋鍵值名稱
else
for (int j = 0; j < header.length; j++) {
Label cell = new Label(j, i, header[j][1]==null?"":header[j][1], wcf);
ws.addCell(cell);
}
}
//生成Excel的資料部分....................
if(header==null)
for (int j = 0; j < keys.length; j++) {
Label cell = new Label(j, i + 1, map.get(keys[j])==null?"":map.get(keys[j]).toString());
ws.addCell(cell);
}
else
for(int j=0;j
Label cell = new Label(j, i + 1, map.get(header[j][0])==null?"":map.get(header[j][0]).toString());
ws.addCell(cell);
}
}
}
// 解析生成型別為bean型別的excel
// 頭部不設定預設為bean欄位的名稱,like:{'標題a','標題b'}
private
Method[] getMethods = null;
for (int i = 0; i < list.size(); i++) {
Object bj = list.get(i);
Class cls = obj.getClass();
Field[] fields = cls.getDeclaredFields();
if (i == 0) {
// 初始化方法陣列,以供後面呼叫
if(header!=null){
getMethods = new Method[header.length];
// 用自定義的列名覆蓋欄位名稱
for (int j = 0; j < header.length; j++) {
String getMethodName = "get"
+ header[j][0].substring(0, 1).toUpperCase()
+ header[j][0].substring(1);
try {
getMethods[j] = cls.getDeclaredMethod(getMethodName,
new Class[] {});
} catch (Exception ex) {
ex.printStackTrace();
log.error(ex.getMessage());
}
Label cell = new Label(j, i, header[j][1]==null?"":header[j][1], wcf);
ws.addCell(cell);
}
}
else{
getMethods = new Method[fields.length];
for (int j = 0; j < fields.length; j++) {
String getMethodName = "get"
+ fields[j].getName().substring(0, 1).toUpperCase()
+ fields[j].getName().substring(1);
try {
getMethods[j] = cls.getDeclaredMethod(getMethodName,
new Class[] {});
} catch (Exception ex) {
ex.printStackTrace();
log.error(ex.getMessage());
}
Label cell = new Label(j, i, fields[j].getName(), wcf);
ws.addCell(cell);
}
}
}
for (int j = 0; j < getMethods.length; j++) {
// fields[j].setAccessible(true);
//System.out.println(j);
Object value = getMethods[j].invoke(obj, new Object[]{});
Label cell = new Label(j, i + 1, value==null?"":value.toString());
ws.addCell(cell);
}
}
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Listnew ArrayList
Map map=new HashMap();
map.put("age",25);
map.put("password","123456");
map.put("username","xxxholic");
for(int i=0;i<10000;i++)
list.add(map);
map=new HashMap();
map.put("姓名", "xxxholic");
map.put("年齡", "25");
map.put("性別", "男");
map.put("地址", "設法的撒");
map.put("電話", "2313123313");
for(int i=0;i<10000;i++)
list.add(map);
ExcelExportor.getInstance(new FileOutputStream("E:\\xx.xls")).export(list);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-702865/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java操作excel之jxlJavaExcel
- Java使用jxl.jar匯出Excel例項JavaJARExcel
- JXL包大解析;Java程式生成excel檔案和解析excel檔案內容JavaExcel
- Java 通過Xml匯出Excel檔案,Java Excel 匯出工具類,Java匯出Excel工具類JavaXMLExcel
- JAVA讀寫excelJavaExcel
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- 通過ajax上傳excelExcel
- 通過GridView匯出ExcelViewExcel
- JXL基本操作
- java通過kerberos認證連線hdfs並寫數JavaROS
- 通過 emscripten 編寫 wasmASM
- Oracle通過SQL Plus生成CSV、Excel檔案OracleSQLExcel
- Vue通過Blob物件實現匯出Excel功能Vue物件Excel
- SQL通過bcp匯出資料到excel檔案SQLExcel
- phpMyadmin通過日誌寫webshellPHPWebshell
- 【JAVA】重寫和過載Java
- jxl 使用筆記 bug 多多筆記
- java通過schema校驗xmlJavaXML
- 來通過寫技術文章掙錢
- JAVA 資料寫入excel併傳送郵件JavaExcel
- 透過 C# 將資料寫入到Excel表格C#Excel
- 編寫JAVA儲存過程Java儲存過程
- 自己挖的坑自己填--jxl進行Excel下載堆記憶體溢位問題Excel記憶體溢位
- 資料庫文件編寫,如何通過Navicat把表導成表格?資料庫快速匯出為excel表格資訊,excel匯出到word表格資料庫Excel
- java讀取excel為物件並進行讀寫操作JavaExcel物件
- 通過JVMTI和JNI對JAVA加密JVMJava加密
- 如何透過C++ 將資料寫入 Excel 工作表C++Excel
- Java中的過載和重寫Java
- java應用通過jdbc連線資料庫jdbc的串的3種寫法:JavaJDBC資料庫
- java讀取excel層級結構的遞迴寫法JavaExcel遞迴
- TDengine可通過資料同步工具 DataX讀寫
- java操作Excel(從我的CSDN搬過來的)薦JavaExcel
- Java的通過管道來實現執行緒通訊Java執行緒
- java通過jdbc連結資料庫JavaJDBC資料庫
- Java自定義Annotation,通過反射解析AnnotationJava反射
- 通過Java反射動態獲取資訊Java反射
- 通過Typesafe Activator建立akka java sampleJava
- python 讀寫 excelPythonExcel