选中多条记录,打印.有可能有上百条,所有IE是不能够支持的. 我们的打印模版开始是htm版的,开始
用模版直接舒服html版word进行打印
<%@ page contentType="application/msword;charset=UTF-8" 大致可以生成word,可以打印,但是不支持外联css,导致页面混乱.最后在网上
看到了 iText ,准备直接把html转成pdf,用了 htmlworder 和 xmlworker ,都一样能转成功,但是样式不够关,道理一样,不支持外联css.最后
只能用jacob了,先在word中,定义成模版,在生成pdf,直接在浏览器中打印.生成倒是没问题,但是分页问题耽误了我半天时间,再此写出关键代码
:
// 合并Word文档
private void mergeWord(List<Map<String,String>> dataList,Dispatch selection,String tempPath) throws Exception {
for(int i=0;i<dataList.size();i++)
{
// Dispatch.put(selection, "Text", "文档内容如下:"+i);
Dispatch.call(selection, "MoveDown");
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.call(selection, "insertFile", tempPath);// 插入文件内容
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
fillData(dataList.get(i), selection);
if( i != dataList.size()-1)
nextPage(selection);
}
}
/**
* 换页
* @throws Exception
*/
public void nextPage(Dispatch select)
throws Exception
{
Dispatch.call(select, "EndKey", new Variant(6));
// 插入分页符
Dispatch.call(select, "InsertBreak" , new Variant(7) );
}
//填充数据
private void fillData(Map p,Dispatch selection)
{
Iterator keys = p.keySet().iterator();
while(keys.hasNext()) {
String oldText = (String) keys.next();
String newValue = (String) p.get(oldText);
replaceAll(selection,oldText,newValue);
}
}
/**
* 根据模板、数据生成word文件
* @param inputPath String 模板文件(包含路径)
* @param outPath String 输出文件(包含路径)
* @param data HashMap 数据包(包含要填充的字段、对应的数据)
*/
public void toWord(String inputPath,String outPath,List<Map<String,String>> dataList) {
String path = "D:\\file_temp.doc";
try {
if(doc==null)
{
File file = new File(path);
if( !file.exists())
file.createNewFile();
doc = open(path);
}
Dispatch selection = select();
mergeWord(dataList,selection,inputPath);
save(outPath);
} catch(Exception e) {
System.out.println("操作word文件失败!");
e.printStackTrace();
} finally {
if(doc != null)
close(doc);
}
}
上面都是工具,下面是调用部分
/** * create word by jacob-> replace $*$ text * @param list business list data * @return */ public static List<Map<String,String>> getJavaWordListMap(List<?> list,String barcodeText,String temppic) { List<Map<String,String>> listMap = new ArrayList<Map<String,String>>(); for( Object object : list) { Map beanmap = BeanMap.create(object); Map<String,String> dataMap = new HashMap<String,String>(); Set set = beanmap.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry mapentry = (Map.Entry)iterator.next(); String key = mapentry.getKey()+""; if( !key.contains(BOOLEAN_INITIALIZED) && !key.contains(BOOLEAN_MODIFIED )) { dataMap.put("$"+key.toUpperCase()+"$", mapentry.getValue()+""); } } try { // 生成一维码部分 dataMap.put("$barcode$", genBarcode(temppic,beanmap.get(barcodeText)+"")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } listMap.add(dataMap); } return listMap; }
barcodeText 为一维码图标
temppic 为生成图片地址下面是测试方法
private void createWord() throws USMException { List<AppforvisaDAO> list = this.getAppbriefList(); String temppic = "d:/barcode/"; List<Map<String,String>> listData = AcsUtil.getJavaWordListMap(list,"appno",temppic); Java2Word j2w = new Java2Word(); j2w.toWord("D:\\file2.doc","D:\\新员工入司需知.pdf",listData); File folder = new File(temppic); AcsUtil.delAllFile(temppic); }
这样就ok了