同行整理,簡單明了,快速上手!
=============================正文1============================
最近和Excel頻繁親密接觸,主要將N個Excel表中的數(shù)據(jù)拷貝到另外的Excel表中規(guī)整為二維結(jié)構(gòu)以便入庫。但是有些表存在合并單元格的情況,甚是惱火,怎么辦哪?好在這N個Excel表結(jié)構(gòu)還比較一致,可以寫程序在指定位置讀取,然后再寫入到新的Excel表中,這樣就OK了。這里面主要用到一個組件JXL.
jxl的安裝:
主要就是將jxl的包放在WEB-INF的classes下面(如果下載到的是.jar文件,就放在lib下面).別忘了將jxl包中的common文件夾也放在WEB-INF下面.
jxl的使用:
主要的功能就是讀Excel文件和寫Excel文件
<b>讀:</b>
讀的時候是這樣的一個思路,先用一個輸入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet從工作薄中得到工作表,用Cell得到工作表中得某個單元格.
InputStream->Workbook->Sheet->Cell,就得到了excel文件中的單元格
代碼:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*,jxl.*,jxl.write.*,jxl.write.*,jxl.format.*" %>
String path="c:\\excel.xls";//Excel文件URL
InputStream is = new FileInputStream(path);//寫入到FileInputStream
jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄
jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一個工作表
Cell cell=st.getCell(0,0);//得到工作表的第一個單元格,即A1
String content=cell.getContents();//getContents()將Cell中的字符轉(zhuǎn)為字符串
wb.close();//關(guān)閉工作薄
is.close();//關(guān)閉輸入流
我們可以通過Sheet的getCell(x,y)方法得到任意一個單元格,x,y和excel中的坐標對應.
例如A1對應(0,0),A2對應(0,1),D3對應(3,2).Excel中坐標從A,1開始,jxl中全部是從0開始.
還可以通過Sheet的getRows(),getColumns()方法得到行數(shù)列數(shù),并用于循環(huán)控制,輸出一個sheet中的所有內(nèi)容.
<b>寫:</b>
往Excel中寫入內(nèi)容主要是用jxl.write包中的類.
思路是這樣的:
OutputStream<-WritableWorkbook<-WritableSheet<-Label
這里面Label代表的是寫入Sheet的Cell位置及內(nèi)容.
代碼:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*,jxl.*,jxl.write.*,jxl.write.*,jxl.format.*" %>
OutputStream os=new FileOutputStream("c:\\test.xls");//輸出的Excel文件URL
WritableWorkbook wwb = Workbook.createWorkbook(os);//創(chuàng)建可寫工作薄
WritableSheet ws = wwb.createSheet("sheet1", 0);//創(chuàng)建可寫工作表
Label labelCF=new Label(0, 0, "hello");//創(chuàng)建寫入位置和內(nèi)容
ws.addCell(labelCF);//將Label寫入sheet中
Label的構(gòu)造函數(shù)Label(int x, int y,String aString)xy意同讀的時候的xy,aString是寫入的內(nèi)容.
WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//設(shè)置寫入字體
WritableCellFormat wcfF = new WritableCellFormat(wf);//設(shè)置CellFormat
Label labelCF=new Label(0, 0, "hello");//創(chuàng)建寫入位置,內(nèi)容和格式
Label的另一構(gòu)造函數(shù)Label(int c, int r, String cont, CellFormat st)可以對寫入內(nèi)容進行格式化,設(shè)置字體及其它的屬性.
現(xiàn)在可以寫了
wwb.write();
寫完后關(guān)閉
wwb.close();
輸出流也關(guān)閉吧
os.close;
OK,只要把讀和寫結(jié)合起來,就可以在N個Excel中讀取數(shù)據(jù)寫入你希望的Excel新表中,還是比較方便的.
=============================正文2============================
在這里,我使用的是一個叫Java Excel API的東西,類似的還有jakarta的POI,不過感覺那個
太復雜了點兒。而且jxl對中文的支持相當?shù)暮?,至少我在用的過程中一點問題沒出。
一、下載地址
http://www.andykhan.com/jexcelapi/
二、特性
可以讀取Excel 95, 97, 2000文件
可以讀或?qū)慐xcel 97及其以后版本的的公式(不過我發(fā)現(xiàn)好像有bug)
生成Excel 97格式的電子表格
支持字體、數(shù)字和日期格式化
支持單元格的顏色和陰影
可以編輯現(xiàn)有的文件
三、讀文件
//聲明一下,記得后面要關(guān)閉哦。。
Workbook workbook = null;
try {
workbook = Workbook.getWorkbook(new File("d:\\temp\\TestRead.xls"));
} catch (Exception e) {
throw new Exception("file to import not found!");
}
Sheet sheet = workbook.getSheet(0);
Cell cell = null;
int columnCount=3;
int rowCount=sheet.getRows();
for (int i = 0; i <rowCount; i++) {
for (int j = 0; j <columnCount; j++) {
//注意,這里的兩個參數(shù),第一個是表示列的,第二才表示行
cell=sheet.getCell(j, i);
//要根據(jù)單元格的類型分別做處理,否則格式化過的內(nèi)容可能會不正確
if(cell.getType()==CellType.NUMBER){
System.out.print(((NumberCell)cell).getvalue());
}
else if(cell.getType()==CellType.DATE){
System.out.print(((DateCell)cell).getDate());
}
else{
System.out.print(cell.getContents());
}
//System.out.print(cell.getContents());
System.out.print("\t");
}
System.out.print("\n");
}
//關(guān)閉它,否則會有內(nèi)存泄露
workbook.close();
寫:wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
在Java中向Excel文件寫入內(nèi)容
四、導出數(shù)據(jù)到Excel文件中
下面的例子,設(shè)置了數(shù)字、日期的格式,還有字體,顏色等。
File tempFile=new File("d:/temp/output.xls");
WritableWorkbook workbook = Workbook.createWorkbook(tempFile);
WritableSheet sheet = workbook.createSheet("TestCreateExcel", 0);
//一些臨時變量,用于寫到excel中
Label l=null;
jxl.write.Number n=null;
jxl.write.DateTime d=null;
//預定義的一些字體和格式,同一個Excel中最好不要有太多格式
WritableFont headerFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLUE);
WritableCellformat headerformat = new WritableCellformat (headerFont);
WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.RED);
WritableCellformat titleformat = new WritableCellformat (titleFont);
WritableFont detFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
WritableCellformat detformat = new WritableCellformat (detFont);
Numberformat nf=new Numberformat("0.00000"); //用于Number的格式
WritableCellformat priceformat = new WritableCellformat (detFont, nf);
Dateformat df=new Dateformat("yyyy-MM-dd");//用于日期的
WritableCellformat dateformat = new WritableCellformat (detFont, df);
//剩下的事情,就是用上面的內(nèi)容和格式創(chuàng)建一些單元格,再加到sheet中
l=new Label(0, 0, "用于測試的Excel文件", headerformat);
sheet.addCell(l);
//add Title
int column=0;
l=new Label(column++, 2, "標題", titleformat);
sheet.addCell(l);
l=new Label(column++, 2, "日期", titleformat);
sheet.addCell(l);
l=new Label(column++, 2, "貨幣", titleformat);
sheet.addCell(l);
l=new Label(column++, 2, "價格", titleformat);
sheet.addCell(l);
//add detail
int i=0;
column=0;
l=new Label(column++, i+3, "標題 "+i, detformat);
sheet.addCell(l);
d=new DateTime(column++, i+3, new java.util.Date(), dateformat);
sheet.addCell(d);
l=new Label(column++, i+3, "CNY", detformat);
sheet.addCell(l);
n=new jxl.write.Number(column++, i+3, 5.678, priceformat);
sheet.addCell(n);
i++;
column=0;
l=new Label(column++, i+3, "標題 "+i, detformat);
sheet.addCell(l);
d=new DateTime(column++, i+3, new java.util.Date(), dateformat);
sheet.addCell(d);
l=new Label(column++, i+3, "SGD", detformat);
sheet.addCell(l);
n=new jxl.write.Number(column++, i+3, 98832, priceformat);
sheet.addCell(n);
//設(shè)置列的寬度
column=0;
sheet.setColumnView(column++, 20);
sheet.setColumnView(column++, 20);
sheet.setColumnView(column++, 10);
sheet.setColumnView(column++, 20);
workbook.write();
workbook.close();
posted on 2007-10-26 09:08
lk 閱讀(2819)
評論(1) 編輯 收藏 所屬分類:
j2se