本文主要介绍的是通过Openoffice+Java jdk的方式将Excel和Word文档转化成PDF文件以供浏览,用的是C#,使用VS设计的可以参考设计,其它语言请选择部分参考。
本文主要有三部分:
第一部分是安装openoffice、jdk的应用服务,以及对其进行调试
第二部分是通过C#将Excel和Word文档转化成PDF文件
第三部分则是对openoffice转换服务的生成和自启动
正文:
1.首先,需要下载安装openoffice、jdk,这里贴上我自己的
openoffice:链接:https://pan.baidu.com/s/1gggd3rX 密码:sxjr
jdk:链接:https://pan.baidu.com/s/1mjDJnxm 密码:it3v
下载完成后直接安装,全部默认设置直到完成安装
2.接下来需要对环境进行配置,以我本机为例,我的是win7操作系统,操作如下:
右击我的电脑》属性》高级系统设置
环境变量
在“系统变量”里进行操作
新建环境变量JAVA_HOME
变量名:JAVA_HOME
变量值: C:\Program Files\Java\jdk1.7.0_45(这个需要自己去找到对应的文件,默认安装的情况下,一般都出现在此位置,也可能安装在其他位置)
修改环境变量:Path
变量名:Path
变量值:原变量保持不便(切记),将%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;放置在最前方,注意有两个分号!
修改或添加环境变量:CLASSPATH
变量名:CLASSPATH
变量值:%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar;注意事项和path变量一致
3.配置好环境变量后,我们便开始调试是否安装成功,即是否可以将Word或者excel转化成PDF文件
A:下载转化必要的转化包,地址如下,下载完毕后将文件夹放置在某一位置
链接:https://pan.baidu.com/s/16w4kQhzdi7EWsV6Tp6speg 密码:bulvB:首先打开命令操作界面:win+R cmd
C:进入界面后,需要将操作转至openoffice,输入cd C:\Program Files (x86)\OpenOffice 4\program(这个也需要在自己电脑上找,此
处是我的默认安装位置)
D:执行soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard操作命令,将服务绑定在8100端口
E:执行命令
java -jar D:/jodconvert2/jodconverter-cli-2.2.2.jar -p 8100 D:\OA表结构.xlsx D:\1111.pdf
注释:
java -jar------------------命令(个人理解查找转化包)
D:/jodconvert2/jodconverter-cli-2.2.2.jar----------转化包位置及文件(看A项操作)
-p-------------------------转化操作(这个是转化excel的,其他的自己百度)
8100----------------------端口号(见D操作)
D:\OA表结构.xlsx-----------需要转化的excel以及其位置
D:\1111.pdf-----------------想要转化后的文件名称及位置
执行完以上操作后,若D:\1111.pdf的位置出现目标文件,则表示目前转化部署已经完成
链接:https://pan.baidu.com/s/1oAqoOUu 密码:ocl6
需要源码的朋友可以联系我,一起共同交流~~
2.在项目中引用dll
3.编写转化代码,这里我就直接贴我代码了,这样比较好讲解,重要的部分我会加粗加下划线
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Web;
namespace sendenOption
{
public static class getEXCELtoPDF
{
public static string CreatePDF(string taskid)
{
//查找对应模板文件件
var error = string.Empty;
var SaveUrl = ConfigurationManager.AppSettings["PDFUrls"];
var templeteUrl = ConfigurationManager.AppSettings["templeteUrl"];
string descFile = taskid + "\\excel{0}" + ".xlsx";
descFile = string.Format(descFile, DateTime.Now.ToString("{yyyy_MM_dd_hh_mm_ss}"));
string sql = "select * from form_salepriceadjust where taskid=" + taskid;
DataTable dt = Lord.Tools.RDS_DbHelper.Query(sql).Tables[0];
if (!Directory.Exists(SaveUrl + taskid))
{
Directory.CreateDirectory(SaveUrl + taskid);
}
File.Copy(templeteUrl, SaveUrl + descFile, true);
FileInfo file = new FileInfo(SaveUrl + descFile);
#region 用于PLJ的变量声明
List
#endregion
try
{
using (ExcelPackage package = new ExcelPackage(file))
{
foreach (var e in package.Workbook.Worksheets)
{
var rowCount = Convert.ToInt32(e.Cells[1, 1].Value);
var ColumnCount = Convert.ToInt32(e.Cells[1, 2].Value);
bool isAddRow = true;
for (int rowi = 2; rowi < rowCount; rowi += isAddRow ? 1 : 0)
{
for (int coli = 1; coli <= ColumnCount; coli++)
{
var text = (e.Cells[rowi, coli].Value ?? string.Empty).ToString();
if (text == "year") { e.Cells[rowi, coli].Value = DateTime.Now.Year.ToString(); }
if (text == "year-1") { e.Cells[rowi, coli].Value = (DateTime.Now.Year-1).ToString();}
if (text == "year-2") { e.Cells[rowi, coli].Value = (DateTime.Now.Year-2).ToString(); }
var startIndex = text.IndexOf('{');
var endIndex = text.IndexOf('}');
if (startIndex >= 0 && endIndex >= 0 && endIndex > startIndex)
{
var templeteStr = text.Substring(startIndex + 2, endIndex - startIndex - 2);
var templeteStrAll = "{#" + templeteStr + "}";
if (dt.Columns.Contains(templeteStr))
{
e.Cells[rowi, coli].Value = text.Replace(templeteStrAll, dt.Rows[0][templeteStr].ToString());
}
else
{ e.Cells[rowi, coli].Value = "<字段绑定错误>"; }
}
}
}
e.DeleteRow(1); //删除标记行
}
deleteSheetName.ForEach(m => package.Workbook.Worksheets.Delete(m));
package.Save();
string pdfFile = taskid + "\\pdf{0}" + ".pdf";
pdfFile = string.Format(pdfFile, DateTime.Now.ToString("{yyyy_MM_dd_hh_mm_ss}"));
ExcelConvert.ExcelConvertManage.StartConvert(SaveUrl + descFile, SaveUrl + pdfFile);
updatePDFURL(taskid, HttpContext.Current.Server.UrlEncode(pdfFile));
return "{ \"result\":\"success\", \"pdfURL\":\"" + HttpContext.Current.Server.UrlEncode(SaveUrl + pdfFile) + "\",\"pdfFile\":\""+ HttpContext.Current.Server.UrlEncode(pdfFile) + "\"}";
}
}
catch (Exception e)
{
throw e;
}
}
}
}
这个代码言简意赅了吧,开始转化(被转化文件路径文件,转化后的文件路径文件)。执行过程中可能会报错,详见下文第三大项
接着第二大项第三点最后一句说,本来这个可以单独写一篇的,最后还是写在一起了,因为方便后面 的使用。在第二大项第三点的情况中,可能会出现一种错误情况,有可能系统不报错,但是没转化成功。如 果系统报错了,大概就知道问题的所在了,如果没报错的话,这里可以提供一个解决思路。回想一下装载了openoffice+jdk的机器是不是存在过重启,因为重启过,8100端口的服务不会自动开启,所以可以执行两种操作:
A:每次开机完成后执行第一大项第三节的B、C、D项操作
B:生成服务自启动(见下文)
2.启下(如何生成服务自启动)
A:查看是否存在Windows Resource Kit Tools,没有请下载并安装
链接:https://pan.baidu.com/s/1bqePH51 密码:3ia7
B:打开已存在的Windows Resource Kit Tools命令操作窗口,执行命令(横线部分全部,注意符号)
"C:\Program Files (x86)\Windows Resource Kits\Tools\instsrv" OpenOfficeServer "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"
注释:(个人理解,仅供参考)
"C:\Program Files (x86)\Windows Resource Kits\Tools\instsrv"----添加服务程序(位置自己找)
OpenOfficeServer-------------------------需要添加的服务名称(随便起,设置并记住,后面要用)
"C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"------执行程序
到此,服务项已添加完毕,记下来需要配置服务
C:打开注册表 win+R regedit,查找注册文件 ,位置如下红色部分就是B操作的服务名
HKEY_LOCAL_MACHINE》SYSTEM》ControlSet001》services》OpenOfficeServer
D:右击注册列表的刚添加的服务名(OpenOfficeServer),选择添加项,名称为 Parameters
E:在新加的Parameters添加两个字符串值,分别如下
key: Application
value: C:\Program Files (x86)\OpenOffice 4\program\soffice.exe
key: AppParameters
value: -invisible -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
这个是不是很熟悉,这就是第一大项需要配置的内容啊~~~~
F:打开服务管理 win+R services.msc ,找到刚才B操作添加的服务器名并开启服务,可以设置为 自动,也可以选择手动,我的是选择了手动。每次开机过后直接进入服务,将服务开启就好了,不用 去CMD命令里输入字符串。当然你也可以选择其他,或者开机自启。
G:最后当然是要检测一下操作是否成功啦
win+R cmd 进入系统命令操作,输入netstat -anop tcp 命令,查看172.0.0.1 的8100端口是
否已被监听即可,附上本人成功图片
好了,到这里本文就全部结束了。如果对你有帮助的话,记得点赞哦。如果想要深入交流,可以联系我哦