(java)客户端套打服务端Excel以及Word

需求:
在客户端可以连接默认打印机打印服务端文件
原始模板
EXCEL模板
开发思路:
1、根据模板生成新的文件,并保存至服务器
2、将生成的文件转化成html
3、客户端打印html文件

本来想用freemarker进行套打,但是不知道什么原因,生成的文件在转化过程中一直报类型转换异常,找了好多解决办法,但是都没办法解决,忘后来人解决!!!!!!!!!!!
最后没办法,只能有原始办法,对模板中的标签进行替换

第一步:根据模板生成新的文件

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class ExcelUtil {
  /**
   * 替换Excel2003模板文件内容
   * @param map
   *     需要替换的标签建筑队形式
   * @param  intPath
   *     Excel模板文件路径
   * @param outPath
   *     Excel生成文件路径
   */
  public static boolean replaceExcel2003Value(Map map, String intPath, String outPath) {
    boolean flag = true;
    try {
      FileInputStream fs = new FileInputStream(intPath);
      //EXCEL xlsx格式与xls格式用的类是不同的,xlsx用的是XSSFWorkbook
      HSSFWorkbook workbook = new HSSFWorkbook(fs);
      HSSFWorkbook wb = (HSSFWorkbook) workbook;
      HSSFSheet sheet;
      //由于个人使用是多sheet故获取excel对象后进行sheet遍历,分别对每个sheet里面的标签进行替换
      for (int j = 0; j < wb.getNumberOfSheets(); j++) {
        sheet = workbook.getSheetAt(j);
        Iterator rows = sheet.rowIterator();
        while (rows.hasNext()) {
          HSSFRow row = (HSSFRow) rows.next();
          if (row != null) {
            int num = row.getLastCellNum();
            for (int i = 0; i < num; i++) {
              HSSFCell cell = row.getCell(i);
              if (cell != null) {
                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
              }
              if (cell == null || cell.getStringCellValue() == null) {
                continue;
              }
              String value = cell.getStringCellValue();
              if (!"".equals(value)) {
                Set<String> keySet = map.keySet();
                Iterator<String> it = keySet.iterator();
                while (it.hasNext()) {
                  String text = it.next();
                  if (value.indexOf(text) > -1) {
                    value = value.replace(text,"");
                    cell.setCellValue(value+map.get(text).toString());
                    break;
                  }
                }
              } else {
                cell.setCellValue("");
              }
            }
          }
        }
      }
      // 输出文件
      FileOutputStream fileOut = new FileOutputStream(outPath);
      wb.write(fileOut);
      fileOut.close();
    } catch (Exception e) {
      flag = false;
      e.printStackTrace();
    }
    return flag;
  }
  /**
   * 替换Excel2007模板文件内容
   * @param map
   *     需要替换的标签建筑队形式
   * @param  intPath
   *     Excel模板文件路径
   * @param outPath
   *     Excel生成文件路径
   */
  public static boolean replaceExcel2007Value(Map map, String intPath, String outPath) {
    boolean flag = true;
    try {
      FileInputStream fs = new FileInputStream(intPath);
      //EXCEL xlsx格式与xls格式用的类是不同的,xlsx用的是XSSFWorkbook
      XSSFWorkbook workbook = new XSSFWorkbook(fs);
      XSSFWorkbook wb = (XSSFWorkbook) workbook;
      XSSFSheet sheet;
      //由于个人使用是多sheet故获取excel对象后进行sheet遍历,分别对每个sheet里面的标签进行替换
      for (int j = 0; j < wb.getNumberOfSheets(); j++) {
        sheet = workbook.getSheetAt(j);
        Iterator rows = sheet.rowIterator();
        while (rows.hasNext()) {
          XSSFRow row = (XSSFRow) rows.next();
          if (row != null) {
            int num = row.getLastCellNum();
            for (int i = 0; i < num; i++) {
              XSSFCell cell = row.getCell(i);
              if (cell != null) {
                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
              }
              if (cell == null || cell.getStringCellValue() == null) {
                continue;
              }
              String value = cell.getStringCellValue();
              if (!"".equals(value)) {
                Set<String> keySet = map.keySet();
                Iterator<String> it = keySet.iterator();
                while (it.hasNext()) {
                  String text = it.next();
                  if (value.indexOf(text) > -1) {
                    value = value.replace(text,"");
                    cell.setCellValue(value+map.get(text).toString());
                    break;
                  }
                }
              } else {
                cell.setCellValue("");
              }
            }
          }
        }
      }
      // 输出文件
      FileOutputStream fileOut = new FileOutputStream(outPath);
      wb.write(fileOut);
      fileOut.close();
    } catch (Exception e) {
      flag = false;
      e.printStackTrace();
    }
    return flag;
  }
}

第二步:将文件转换正html页面

import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

public class excelToHtml {
  /**
   * 将excel2003转换为html文件
   *
   * @param filePath word文件路径
   * @param outFileName html文件名称
   * @throws IOException
   * @throws TransformerException
   * @throws ParserConfigurationException
   */
  public static String excelToHtml(String filePath,String outFileName){
    File excelFile = new File(filePath);
    InputStream is = null;
    StringWriter writer = null;
    String content = null;
    try {
      if (excelFile.exists()) {
        String htmlPath = excelToHtml.class.getResource("/").getPath()+"/templates/manage/print/";
        // 判断html文件是否存在
        File htmlFile = new File(htmlPath + outFileName);
        if (htmlFile.exists()) {
          return outFileName;
        }
        is = new FileInputStream(excelFile);
//      Workbook workBook = WorkbookFactory.create(is);
        HSSFWorkbook workBook = new HSSFWorkbook(is);
        ExcelToHtmlConverter converter = new ExcelToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
        //设置不输出行号(1 2 3...)及列标(A B C...)等
        converter.setOutputColumnHeaders(false);
        converter.setOutputHiddenColumns(false);
        converter.setOutputLeadingSpacesAsNonBreaking(false);
        converter.setOutputRowNumbers(false);   //不输出行号
        converter.processWorkbook(workBook);
        writer = new StringWriter();
        Transformer serializer = TransformerFactory.newInstance().newTransformer();
        serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        serializer.setOutputProperty(OutputKeys.INDENT, "YES");
        serializer.setOutputProperty(OutputKeys.METHOD, "HTML");
        serializer.transform(
                new DOMSource(converter.getDocument()),
                new StreamResult(writer));
        content = writer.toString();
        //替换掉Sheet1 Sheet2 Sheet3...
        content = content.replaceAll("<h2>Sheet[\\d]</h2>", "")
                .replaceAll("<h2>第[一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾]页</h2>", "");
        FileOutputStream fos = new FileOutputStream(htmlPath+outFileName);
        Writer os = new OutputStreamWriter(fos, "UTF-8");
        os.write(content);
        os.flush();
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (is != null) {
          is.close();
        }
        if (writer != null) {
          writer.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }

    }
    return outFileName;
  }

  public static void main(String[] args) {

    String htmlPath = excelToHtml.class.getResource("/").getPath().replace("/target/classes","")+"src/main/resources/templates/manage/print/";
    //excelToHtml("F:\\template\\333.xls");
    System.out.println(htmlPath);
  }
}

注意:如果实在本地打印的话,需要将转化成的html页面进行设置

content = content.replaceAll("<body class=\"b1\">","<body class=\"b1\" οnlοad=\"javascript:doPrint()\" >");
content = content.replaceAll("</body>","</body>\n<script type=\"text/javascript\">\nfunction doPrint(){\n" +
                "        window.focus();  //这个一定要有,否则打印的是A页面+B页面\n" +
                "        window.print();\n" +
                "    }\n</script>");

第三步:在项目中的功能页面将生成的html引入,不然直接打印该页面就会出现先加载该页面,为了不加载该页面可以直接打印,可以使用iframe将该页面引入到某些功能页面中,在功能页面中点击打印就可以直接不显示该页面打印,但是会弹出打印预览界面

<iframe id="printHtml" width = "0"   height = "0"  style = "display:none"></iframe>

在点击打印按钮时,将该页面直接加载到iframe 中,然后就直接弹出打印预览界面进行打印

document.getElementById('printHtml').src = "页面地址";

最后生成的效果:

在这里插入图片描述
点击excel打印,弹出打印预览界面

在这里插入图片描述

OK,excel通过浏览器在本地打印就完成了!!!!!!!!!!!!!!!!!!

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值