您的位置:首页 > 编程语言 > Java开发

java操作Excel

2012-10-20 15:17 246 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://shuyangyang.blog.51cto.com/1685768/1028421

项目中使用了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.NumberFormat nf = new jxl.write.NumberFormat("#.##");

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)设置单元格样式

jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);

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)
{
e.printStackTrace();
}
}

public static void writeExcel(String filePath)
{
try
{
//创建工作薄
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.write();
wwb.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public static void readExcel(String filePath)
{
/**
*后续考虑问题,比如Excel里面的图片以及其他数据类型的读取
**/
try
{
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");
}
//操作完成时,关闭对象,释放占用的内存空间
rwb.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}


本文出自 “On My Way” 博客,请务必保留此出处http://shuyangyang.blog.51cto.com/1685768/1028421
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java Excel 文章