第六天 复杂制式表单打印~购销合同
1.购销合同报表分析,读程
1)购销合同是否可以利用模板来开发。
POI区域拷贝,网上有类似行拷贝。不支持特殊元素的拷贝。货物信息在变化,有可能两个,有可能一个,一个时货物下面的信息位置都被提上来。
如果非要用模板实现,改造,把每页作为一个sheet的内容。POIsheet拷贝。一个货物的做一个模板,两个货物的做一个模板。或者利用程序判断,一个或者两个货物。
2)图片如何插入到excel
HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //add picture
poiUtil.setPicture(wb, patriarch, path+"make/xlsprint/logo.jpg", 开始行, 开始列, 结束行, 结束列);
3)如何画线
poiUtil.setLine(wb, patriarch, 开始行, 开始列, 结束行, 结束列); //draw line
4)如何设置单元格换行
curStyle.setWrapText(true); // 换行
5)如何设置单元格的前缀
public short rmb4Format(HSSFWorkbook wb) {
HSSFDataFormat format = wb.createDataFormat();
return format.getFormat("\"¥\"#,###,##0.00"); // 设置格式
}
6)如何建立公式
nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
nCell.setCellFormula("F"+String.valueOf(curRow)+"*H"+String.valueOf(curRow));
7)验货员不能由于输入审单人,它的位置不能发生变化
utilFuns.fixSpaceStr(contract.getCheckBy(),26)
8)行自适应内容的高度
float height = poiUtil.getCellAutoHeight(printMap.get("Request"), 12f); //自动高度
9)分页符
if(p>0){
sheet.setRowBreak(curRow++); //在第startRow行设置分页符
}
10)数据和业务分离。单独组织数据源,打印时只关系它从哪一页获取数据?
Map<String,String> pageMap = null;
List<Map> pageList = new ArrayList(); //打印页
Map pageMap 存储每页数据,打印时就无需关心数据从哪个对象中来,直接从它的pageMap拿,只需要按业务的key来获取。获取数据变的简单。打印代码和获取数据就不用交叉,代码结构更清晰,维护人更方便读程。
pageList存放所有页,每条记录就是一页,一页数据都放在pageMap中。
11)日期格式转换,转为中文格式
UtilFuns.formatDateTimeCN(UtilFuns.dateTimeFormat(contract.getSigningDate())));
12)合并单元格,如果有边线
操作的样式只设置了第一个单元格。手工设置其它的单元格,补上线。
2.重点知识回顾
复杂报表的打印
开发步骤:
1)读程
a)通读人家的程序代码
b)浏览人家写的注释
c)自己一行一行的写注释
d)重点放在特殊功能,插入图片,插入线,if,for
e)运行起来,跟踪断点
f)改造
2)打印
复杂报表打印开发步骤:
a)POI先实现业务,可以先不修饰
b)边写代码边写样式,立刻看到打印结果(熟练)