JAVA操作Excel,读取Excel模板动态写入数据并生成Excel

     现在来看看如何读取Excel模板然后把动态数据写入到模板以生成特定格式的Excel。
同样的思路,先来考虑下会涉及到那些对象,和上篇文章读取相比这里涉及到一个写入的步骤,所以JXL必然会提供一个对象来支持写入,这就是WritableWorkbook。那么如何得到到这个类的实例,查看APIDoc发现Workbook类提供了几个 静态的createWorkbook方法返回WritableWorkbook实例,可以看到众多createWorkbook方法主要分为两类:一个参数和两个参数。简单分析可以得知前者仅仅是用来直接生成Excel文件,后者先读取模板再向模板写入数据然后生成Excel。(还有一个三参数方法加上一个用来设置workbook的参数) 现在按照上篇文章中所讲述的流程来看看读取模板并写入需要那些步骤。

 

第一步:选择模板文件: 

Workbook wb = Workbook.getWorkbook(new File(realpath));

 

第二步:通过模板得到一个可写的Workbook:
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
第一个参数是一个输出流对象,比如可以
ByteArrayOutputStream targetFile = new ByteArrayOutputStream();
这样定义这个输出流对象。第二个参数代表了要读取的模板。

第三步:选择模板中名称为StateResult的Sheet:
WritableSheet wws = wwb.getSheet("StateResult");
如果需要也可以创建Sheet
WritableSheet wws = wwb.createSheet("Sheet名称",i);

第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
Label A1 = (Label)wws.getWritableCell(0,0);
A1.setString("单元格内容")

Number A2 = (Number)wws.getWritableCell(0,1);//Number是jxl.write.Number
A2.setValue(3.3);
也可以创建新的单元格并且加入到Sheet中
Label C1 = new Label(2,0,"单元格内容");
wws.addCell(C1);

Number C1 = new Number(2,0,3.3);
wws.addCell(C1);

在生成Excel报表的时候还会遇到一种需求就是数据的格式问题,我们可能希望数值型单元格以某种格式显示,而字符串型单元格以另

一种格式显示。这些可以通过WritableFont、NumberFormat、WritableCellFormat等实现,下例给单元格A1、A2添加了不同的格式。

 

java 代码
WritableFont font= new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.NO_BOLD);
NumberFormat format = new NumberFormat("###,##0.00"); //NumberFormat是jxl.write.NumberFormat
WritableCellFormat cellFormat1 = new WritableCellFormat(font,format);
WritableCellFormat cellFormat2 = new WritableCellFormat(font);
cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
A2.setCellFormat(cellFormat1);
A1.setCellFormat(cellFormat2);
还有不要忘记关闭WritableWorkbook和Workbook以释放资源:
wwb.close();
wb.close();

最后就可以你需要的方式从输出流targetFile中取得Excel,比如直接生成文件存本地,输出到客户端浏览器等。

如果还有其他需求,按照这种思路,再参照APIDoc相信可以很容易的解决。

至此,Java操作Excel之理解JXL就写完了。下一篇会介绍如何用Jakarta POI操作Excel。

根据excel模板动态导出数据数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值