項目中使用了Struts,現在想要導出一組資料為Excel檔案,那麼可以這樣:(首先需要jxl.jar包,我的是jxl-2.6.jar)
/**
* 導出報修單
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws IOException
* @throws WriteException
*/
public ActionForward print(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IOException, WriteException {
response.reset();//設定頁面不緩存
response.setContentType("application/vnd.ms-excel");//設定檔案流導出格式
List expendInfoList=dao.findByProperty("states", 1);//此為查詢出資料傳回為List
ExpendablesfixToExcel ef=new ExpendablesfixToExcel(response.getOutputStream());//此為定義的導出EXCEL類,将輸出流傳入到構造函數中
ef.ebfToExcel(expendInfoList);//調用導出類裡的導出方法
return null;
}
以下為導出方法:
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import com.ghtn.techschool.entitys.Expendablesfix;
public class ExpendablesfixToExcel {
OutputStream os;//輸出流
WritableWorkbook wb;//建立Excel檔案
WritableSheet ws;//sheet名稱
/**
* 構造函數
* @param os
* @throws IOException
public ExpendablesfixToExcel(OutputStream os)throws IOException{
this.os=os;
* 導出Excel方法
* @param list
* @throws WriteException
public void ebfToExcel(List<expendablesfix> list) throws WriteException{
//設定樣式(這個方法算是一個容器,可以放進去好多屬性;
//第一個: TIMES是字型大小,這裡寫的是12;第二個: BOLD是判斷是否為斜體,選擇true時為斜體;
//第三個: ARIAL;第四個: UnderlineStyle.NO_UNDERLINE 下劃線;
//第五個: jxl.format.Colour.RED 字型顔色是紅色的)
WritableFont font2 = new WritableFont(WritableFont.TIMES, 12,
WritableFont.BOLD);
WritableCellFormat format2 = new WritableCellFormat(font2);
format2.setAlignment(jxl.format.Alignment.CENTRE);//設定居中
try{
wb=Workbook.createWorkbook(os);
ws=wb.createSheet("報修單", 0);
//第一個是代表列數,
//第二是代表行數,
//第三個代表要寫入的内容
//第四個是可選項,是輸入這個label裡面的樣式
//然後通過寫sheet的方法addCell()把内容寫進sheet裡面。
Label labelA=new Label(0,0,"報修人",format2);
ws.addCell(labelA);
Label labelB=new Label(1,0,"所在部門",format2);
ws.addCell(labelB);
Label labelC=new Label(2,0,"報修日期",format2);
ws.addCell(labelC);
Label labelD=new Label(3,0,"消耗品名稱",format2);
ws.addCell(labelD);
Label labelF=new Label(4,0,"消耗品報修描述",format2);
ws.addCell(labelF);
writeRecruit(list);//擷取動态内容的方法
wb.write();//寫入
wb.close();//關閉
}catch(Exception e){
e.printStackTrace();
}
private void writeRecruit(List<expendablesfix> stuList){
if(stuList.size()==0){
return ;
for(int i=0;i<stuList.size();i++){
String person="";//報修人
if(null!=stuList.get(i).getBxr()){
person=stuList.get(i).getBxr().toString();
}
Label labelBxr = new Label(0,i+1,person);
String dept="";//所在部門
if(null!=stuList.get(i).getBm()){
dept=stuList.get(i).getBm().toString();
Label labelBm=new Label(1,i+1,dept);
String date="";//報修日期
if(null!=stuList.get(i).getBdate()){
date=stuList.get(i).getBdate().toString();
Label labelBdate=new Label(2,i+1,date);
String name="";//消耗品名稱
if(null!=stuList.get(i).getExpendablesname()){
name=stuList.get(i).getExpendablesname().toString();
Label labelName=new Label(3,i+1,name);
String descrition="";//消耗品報修描述
if(null!=stuList.get(i).getBxzk()){
descrition=stuList.get(i).getBxzk().toString();
Label labelDescrition=new Label(4,i+1,descrition);
/*
* 統一添加到清單中
* */
try{
ws.addCell(labelBxr);
ws.addCell(labelBm);
ws.addCell(labelBdate);
ws.addCell(labelName);
ws.addCell(labelDescrition);
}catch(Exception e){
e.printStackTrace();
}
</expendablesfix></expendablesfix>
寫入資料的時候注意的格式
(1)添加的字型樣式
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableFont()方法裡參數說明:
這個方法算是一個容器,可以放進去好多屬性
第一個: TIMES是字型大小,他寫的是18
第二個: BOLD是判斷是否為斜體,選擇true時為斜體
第三個: ARIAL
第四個: UnderlineStyle.NO_UNDERLINE 下劃線
第五個: jxl.format.Colour.RED 字型顔色是紅色的
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell",wcfF);
ws.addCell(labelC);
在Label()方法裡面有三個參數
第一個是代表列數,
第二是代表行數,
第三個代表要寫入的内容
第四個是可選項,是輸入這個label裡面的樣式
然後通過寫sheet的方法addCell()把内容寫進sheet裡面。
(2)添加帶有formatting的Number對象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
(3)添加Number對象
(3.1)顯示number對象資料的格式
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
Number()方法參數說明:
前兩上表示輸入的位置
第三個表示輸入的内容
(4)添加Boolean對象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
(5)添加DateTime對象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
DateTime()方法的參數說明
前兩個表示輸入的位置
第三個表示輸入的目前時間
(6)添加帶有formatting的DateFormat對象
這個顯示目前時間的所有資訊,包括年月日小時分秒
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
(7)添加帶有字型顔色Formatting的對象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
import="jxl.format.*
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN);
(8)設定單元格樣式
wcfFC.setBackGround(jxl.format.Colour.RED);//設定單元格的顔色為紅色
wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);
下面是一段網友操作的例子:
我寫的練習代碼如下:(注意裡面的圖檔替換成自己的就可以了)
import java.io.*;
import java.util.Random;
import java.util.Date;
import jxl.*;
import jxl.format.UnderlineStyle;
import jxl.write.*;
import jxl.write.Number;
import jxl.write.Boolean;
public class CreateXL
{
public CreateXL()
{
public static void main(String[] args)
//讀Excel
//CreateXL.readExcel("d:/abc.xls");
//建立新的Excel
CreateXL.writeExcel("d:/new.xls");
//更新Excel
CreateXL.updateExcel("d:/new.xls");
//jxl暫時不提供修改已經存在的資料表,這裡通過一個小辦法來達到這個目的,不适合大型資料更新!
//這裡是通過覆寫原檔案來更新的.
public static void updateExcel(String filePath)
try
{
Workbook rwb = Workbook.getWorkbook(new File(filePath));
WritableWorkbook wwb = Workbook.createWorkbook(new File("d:/new.xls"),rwb);//copy
WritableSheet ws = wwb.getSheet(0);
WritableCell wc = ws.getWritableCell(0,0);
//判斷單元格的類型,做出相應的轉換
Label label = (Label)wc;
label.setString("The value has been modified");
wwb.write();
wwb.close();
rwb.close();
catch(Exception e)
public static void writeExcel(String filePath)
//建立工作薄
WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath));
//建立工作表
WritableSheet ws = wwb.createSheet("Sheet1",0);
//System.out.println("create ok!");
//添加标簽文本
Random rnd=new Random((new Date()).getTime());
int forNumber=rnd.nextInt(100);
for(int i=0;i<forNumber;i++)
{
ws.addCell(new Number(rnd.nextInt(50),rnd.nextInt(50),rnd.nextInt(1000)));
//添加圖檔(注意此處jxl暫時隻支援png格式的圖檔)
//0,1分别代表x,y 2,5代表寬和高占的單元格數
ws.addImage(new WritableImage(0,1,2,5,new File("png//cs.png")));
wwb.close();
System.out.println(e.toString());
public static void readExcel(String filePath)
/**
*後續考慮問題,比如Excel裡面的圖檔以及其他資料類型的讀取
**/
InputStream is=new FileInputStream(filePath);
//聲名一個工作薄
Workbook rwb = Workbook.getWorkbook(is);
//獲得工作薄的個數
//rwb.getNumberOfSheets();
//在Excel文檔中,第一張工作表的預設索引是0
Sheet st = rwb.getSheet("Sheet1");
//通用的擷取cell值的方式,getCell(int column, int row) 行和列
int Rows=st.getRows();
int Cols=st.getColumns();
System.out.println("目前工作表的名字:"+st.getName());
System.out.println("總行數:"+Rows);
System.out.println("總列數:"+Cols);
Cell c;
for(int i=0;i<Cols;++i)
for(int j=0;j<Rows;++j)
{
//getCell(Col,Row)獲得單元格的值
System.out.print((st.getCell(i,j)).getContents()+"/t");
}
System.out.print("/n");
//操作完成時,關閉對象,釋放占用的記憶體空間
}
本文轉自shyy8712872 51CTO部落格,原文連結:http://blog.51cto.com/shuyangyang/1028421,如需轉載請自行聯系原作者