要做成:
打印区域为:
划分的小单元是一盒的数据,也就是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
}