JavaScript打印Excel、Word

JavaScript打印Excel、WordJavaScript调用本地打印机,打印Excel、Word文件之前写过一篇文章,使用java调用打印机打印Excel文件:java调用打印机:http://blog.csdn.net/wangxiaoan1234/article/details/75116072但是java运行与服务器上,外部访问无法调用本地打印机。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

JavaScript调用本地打印机,打印Excel、Word文件


之前写过一篇文章,使用java调用打印机打印Excel文件:
java调用打印机:http://blog.csdn.net/wangxiaoan1234/article/details/76032280
但是java运行与服务器上,外部访问无法调用本地打印机。
假设项目需求为:点击按钮打印某个报表(Excel)。当项目发布到服务器上后,当使用java调用打印机,无论哪台电脑访问页面,点击打印按钮,调用的都是java所运行的服务器上的打印机。

理想:

Created with Raphaël 2.1.0 用户 用户 服务器 服务器 我要打印报表 收到请求,调用打印程序 弄好了,你打印吧 调用打印机,打印报表

实际:

Created with Raphaël 2.1.0 用户 用户 服务器 服务器 我要打印报表 收到请求,调用打印程序 怎么调用了我自己的打印机,是java的锅,我不背 很抱歉,报表在我这打印好了,你过来取吧! 你大爷的!

解决思路:
JavaScript运行在本地,使用JavaScript调用本地打印机。

想到可行方法:

  • 直接调用打印机打印本地文件(IE浏览器用此方法)。
  • java后台将Excel转换成html页面,调用window.print()函数打印整个页面(通用);
  • 安装打印插件(麻烦)

使用Spring poi将Excel、Word转换为html再进行打印的好处有:

  1. 所有浏览器通用
  2. 可以进行打印预览
  3. 可视化的打印参数设置
  4. 我不会别的o(╯□╰)o

IE浏览器直接调用打印机(无预览):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打印测试</title>
</head>
<body>
    <input id="btnPrint" value="打印整个页面" type="button" onclick="btnPrintClick()"/>  
    <input id="btnPrintExcel" value="打印Excel" type="button" onclick="printExcel('D:/test.xlsx')"/> 
    <script> //调用浏览器的打印功能  function btnPrintClick(){ 
     window.print(); } //打印Excel function printExcel(obj) { 
     var explorer = window.navigator.userAgent ; if (explorer.indexOf("MSIE") >= 0 || "ActiveXObject" in window) { //判断是否为ie浏览器 var xlsApp = null; try { xlsApp = new ActiveXObject('Excel.Application'); } catch(e) { alert(e + ', 原因分析: 浏览器安全级别较高导致不能创建Excel对象或者客户端没有安装Excel软件'); return; } var xlBook = xlsApp.Workbooks.Open(obj); var xlsheet = xlBook.Worksheets(1); xlsApp.Application.Visible = false; xlsApp.visible = false; xlsheet.Printout; xlsApp.Quit(); xlsApp=null; } else { alert("只支持IE浏览器"); } } </script>
</body>
</html>

Jetbrains全家桶1年46,售后保障稳定


Java将Excel解析成html,在该页面上调用window.print()打印页面:

maven依赖:

<!-- POI -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.lucee/curvesapi -->
        <dependency>
            <groupId>org.lucee</groupId>
            <artifactId>curvesapi</artifactId>
            <version>1.04.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.6.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.16</version>
        </dependency>

jar包下载地址:http://download.csdn.net/detail/wangxiaoan1234/9909138

后台Excel转换HTML类:
类文件下载地址:http://download.csdn.net/detail/wangxiaoan1234/9909123

package com.srie.util.excel;

import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

/** * 利用POI将Excel2003转换为HTML(不能读取图片并且不支持Excel2007) */
public class PoiExcel03lToHtml { 
   

    /** * 程序入口方法 * @param excelPath 待读取的Excel路径 * @param htmlPath 转换生成的HTML输出路径 */
    public static void convertExcelToHtml(String excelPath, String htmlPath) {
        File excelFile = new File(excelPath);
        File htmlFile = new File(htmlPath);
        File htmlFolder = htmlFile.getParentFile();
        InputStream is = null;
        OutputStream out = null;
        StringWriter writer = null;
        String content = null;
        try{
            if(excelFile.exists()){
                if(!htmlFolder.exists()){
                    htmlFolder.mkdirs();
                }
                is = new FileInputStream(excelFile);
                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.setOutputColumnHeaders(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) );
                out = new FileOutputStream(htmlFile);
                content = writer.toString();
                //替换掉Sheet1 Sheet2 Sheet3...
                content = content.replaceAll("<h2>Sheet[\\d]</h2>", "")
                        .replaceAll("<h2>第[一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾]页</h2>", "");

                out.write(content.getBytes("UTF-8"));
                out.flush();
                out.close();
                writer.close();
            }
        } catch (IOException | ParserConfigurationException | TransformerException e) {
            e.printStackTrace();
        } finally{
            try{
                if(is != null){
                    is.close();
                }
                if(out != null){
                    out.close();
                }
                if(writer != null){
                    writer.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

class TestExcel {
    public static void main(String[] args) throws Exception {
        PoiExcel03lToHtml.convertExcelToHtml("D:/test.xls", "D:/test.html");
    }
}

生成html后就可以各种调用打印了。
我采用的方法是:

  1. 前台ajax访问后台转换方法
  2. 后台返回第58行的content字符串,这个字符串就是整个html页面代码。
  3. 将ajax的返回结果写入到一个新页面,然后打印这个新页面。

前台js代码:

/** * 打印方法 * @author 王晓安 * @创建时间 2017年7月19日10:32:39 * @param url 请求打印的路径 */
function print(url){ 
   
    $.ajax({
        url: url,
        data: {
            ...
        },
        type: "POST",
        dataType: "json",
        success: function(result){ 
   
            var printWin=window.open("打印窗口", "_blank");
            printWin.document.write(result);
            printWin.document.close();
            printWin.print();
            printWin.close();
        }
    });
}

测试结果:

Excel文件:
这里写图片描述


生成的html页面:
生成的html页面


js打印设置:
这里写图片描述


打印的pdf文件:
这里写图片描述

注意:

当图表比较宽,所选纸张会出现只打印部分页面情况。如下所示:
这里写图片描述

解决办法:
调整页边距:效果较小
更换打印纸张:效果明显
调整缩放:效果明显

以下图片是进行缩放的演示:
这里写图片描述


打印word与打印Excel类似:

后台word2003转HTML类:
类文件下载地址:http://download.csdn.net/detail/wangxiaoan1234/9909154

package com.srie.util.excel;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.util.List;
/**
* 利用POI将Excel2003转换为HTML(支持图片但不支持Excel2007)
*/
public class PoiWord03ToHtml { 

/**
* 程序入口方法
* @param wordPath 待读取的word路径
* @param htmlPath 转换生成的HTML输出路径
*/
public static void convertExcelToHtml(String wordPath, String htmlPath){
File htmlFile = new File(htmlPath);
File htmlFolder = htmlFile.getParentFile();
InputStream is = null;
OutputStream out = null;
StringWriter writer = null;
String content;
try {
is = new FileInputStream(wordPath);
HWPFDocument wordDocument = new HWPFDocument(is);
WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
//不支持λ表达式请用注释里面的代码
wordToHtmlConverter.setPicturesManager((bytes, pt, string, f, f1) -> string); /* wordToHtmlConverter.setPicturesManager(new PicturesManager() { public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) { return suggestedName; } });*/ wordToHtmlConverter.processDocument(wordDocument); List pics = wordDocument.getPicturesTable().getAllPictures(); if (pics != null) { for (Object pic1 : pics) { Picture pic = (Picture) pic1; try { pic.writeImageContent(new FileOutputStream(htmlFolder + pic.suggestFullFileName())); } catch (FileNotFoundException e) { e.printStackTrace(); } } } Document htmlDocument = wordToHtmlConverter.getDocument(); 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(htmlDocument), new StreamResult(writer)); out = new FileOutputStream(htmlFile); content = writer.toString(); out.write(content.getBytes("UTF-8")); out.flush(); out.close(); writer.close(); } catch (IOException | ParserConfigurationException | TransformerException e) { e.printStackTrace(); } finally { try{ if(is != null){ is.close(); } if(out != null){ out.close(); } if(writer != null){ writer.close(); } }catch(IOException e){ e.printStackTrace(); } } } } class TestWord { public static void main(String[] args) throws Exception { PoiWord03ToHtml.convertExcelToHtml("D:/test.doc", "D:/test.html"); } }

测试结果:

word2003文档:
word2003文档:

HTML显示:
html显示

有哪位大神知道怎么使用poi将office2007转换成html吗?请赐教啊!!!

Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

同样的方法,打印.xlsx或者.docx文件时就会抛如上异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/210038.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 【建议收藏】MySQL 三万字精华总结 —分区、分表、分库和主从复制(五)

    【建议收藏】MySQL 三万字精华总结 —分区、分表、分库和主从复制(五)

  • linux服务器开启snmp_snmp trap

    linux服务器开启snmp_snmp trap配置snmptrapvi/etc/snmp/snmptrap.conf,在文件最后添加如下agentAddressudp:127.0.0.1:161viewsystemonlyincluded.1.3.6.1.2.1.1viewsystemonlyincluded.1.3.6.1.2.1.25.1rocommunitycsg-tsgz991172.16.140.214-VsystemonlyrouserauthOnlyUsersysL

  • springcloud原理详解_数据库底层实现原理

    springcloud原理详解_数据库底层实现原理天天喊着微服务,微服务的,微服务怎么牛逼,微服务有多强大,学好微服务三天不用吃饭的那种?那我心里不禁一紧微服务到底是个啥?往下看!总有东西有点帮助!先来个简单的介绍吧!SpringCloud框架针对这个架构图我分层介绍一下:1、是web服务器的选型,这个我选择的是nginx+keepalived,haproxy也是一个选择,但是haproxy在反向代理处理跨域访问的时候问题很多…

  • 新概念51单片机C语言教程纠错(3)「建议收藏」

    新概念51单片机C语言教程纠错(3)「建议收藏」这一次错误在课本P140页例6.6.1中,这个例子在proteus仿真中再一次刷新了我的认知主要的bug在两个地方,第一仍是单片机上电后数码管的点亮问题,由于这个例题需要数码管不断刷新,所以bug的影响比前一篇纠错文章中更加明显;第二是由于没加延迟函数导致的无脑刷新问题。具体效果视频中有表现,其中的操作为,上位机输入1,单片机的ad打开,并返回voltage到调试助手,同时数码管显示数字。输入…

  • Matlab中length函数的使用

    Matlab中length函数的使用目录一.语法1.输入参数二.说明三.示例1.向量元素数2.矩形矩阵的长度3.字符串数组4.结构体字段的长度length函数是求最大数组维度的长度。一.语法L=length(X)1.输入参数X-输入数组标量|向量|矩阵|多维数组输入数组,指定为标量、向量、矩阵或多维数组。复数支持:是提示 要计算字符串或字符向量中的字符数量,请使用strlength函数。 length不对表执行运算。要检查…

  • ES 复合查询

    ES 复合查询

    2021年11月27日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号