要做成:
打印区域为:
划分的小单元是一盒的数据,也就是8行为一个单元来填入数据,这个看你具体的业务。更常见的是以一行为单位。
使用工具:某大佬的插件,稍微改动了一下打印部分的设置
ExcelTemplate插件代码https://gitee.com/jiangyongbing24/poi/blob/master/src/export/ExcelTemplate.java
博客原文
https://blog.csdn.net/jiangyongbing008/article/details/100795250
下载下来建一个工具类就行了
excel 模板
2-11行是我要循环的单元,代码中是用下标所以是1-10
测试代码:
public static void hahah(){ File file; FileOutputStream fop = null; try { ExcelTemplate excel = new ExcelTemplate("D:\\excel3.xlsx"); if(!excel.examine()) return; LinkedHashMap<Integer, LinkedList<String>> rows = new LinkedHashMap<>(); // 创建第一个行区域里面填充的值,ExcelTemplate会按从左至右, // 从上往下的顺序,挨个填充区域里面的${},所以创建的时候注意顺序就好 LinkedList<String> row1 = new LinkedList<>(); // 把第一个行区域row1添加进入rows for(int i =1;i<=8;i++){ row1.add(i+""); row1.add("当好档号"); row1.add("文号文号"); row1.add("责任者责任者"); row1.add("题名题名题名"); row1.add("20190910"); row1.add("页数"); row1.add("全宗号"); row1.add("代码"); row1.add("年度"); if(i==8){ row1.add("第 209 盒"); } } rows.put(1,row1); rows.put(2,row1); rows.put(3,row1); rows.put(4,row1); //设置放进去4个单元,就是4盒的数据 // 第一个参数,需要操作的sheet的索引 // 第二个参数,需要复制的区域的第一行索引 // 第三个参数,需要复制的区域的最后一行索引 // 第四个参数,需要插入的位置的索引 // 第五个参数,填充行区域中${}的值 // 第六个参数,是否需要删除原来的区域 // 需要注意的是,行的索引一般要减一 excel.addRowByExist(0,1,10,1,rows,true); // Workbook workbook = excel.getWorkbook(); file = new File("D:/newfile.xlsx"); excel.save(file.getPath());//他封装了保存的接口,不需要自己处理了 // fop = new FileOutputStream(file); // byte[] contentInBytes = excel.getBytes(); // fop.write(contentInBytes); // fop.flush(); // fop.close(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fop != null) { fop.close(); } } catch (IOException e) { e.printStackTrace(); } } }
打印的时候要设置边距,以及“归档文件目录”需要在打印的每页都显示,但是实际报表上只显示一次,如果手动操作的话是在“页面布局”,“”打印标题“”下设置,填入 $1:$1 ,第一行第一列作为打印标题
稍微改动代码,在ExcelTemplate.java中,initsheet方法里面,加入对打印的设置
发现这个单位有问题,我设置1,那么被设置为了2.5,所以单位尺就除以了2.5
{// sheet.setRepeatingRows(new CellRangeAddress(0,0,0,0)); //设置每页都有的打印标题,对应图中的$1:$1 sheet.setMargin(HSSFSheet.BottomMargin,((double)6/(double)25));// 页边距(下) sheet.setMargin(HSSFSheet.TopMargin,( double ) 19/(double) 25 );// 页边距(左) sheet.setMargin(HSSFSheet.RightMargin,( double ) 1/(double) 2.5 );// 页边距(右) sheet.setMargin(HSSFSheet.LeftMargin,( double ) 1 /(double) 2.5);// 页边距(上) sheet.getPrintSetup().setLandscape(true); //纸张方向水平 sheet.getPrintSetup().setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置A4 }