C# openoffice+jdk Excel、Word转PDF教程全套 包括openoffice自启服务生成状态

 本文主要介绍的是通过Openoffice+Java jdk的方式将Excel和Word文档转化成PDF文件以供浏览,用的是C#,使用VS设计的可以参考设计,其它语言请选择部分参考。

本文主要有三部分:

第一部分是安装openoffice、jdk的应用服务,以及对其进行调试

第二部分是通过C#将Excel和Word文档转化成PDF文件

第三部分则是对openoffice转换服务的生成和自启动


正文:

一、安装openoffice、jdk的应用服务,以及对其进行调试

 1.首先,需要下载安装openoffice、jdk,这里贴上我自己的

 openoffice:链接:https://pan.baidu.com/s/1gggd3rX 密码:sxjr

jdk:链接:https://pan.baidu.com/s/1mjDJnxm 密码:it3v

    下载完成后直接安装,全部默认设置直到完成安装

2.接下来需要对环境进行配置,以我本机为例,我的是win7操作系统,操作如下:

 右击我的电脑》属性》高级系统设置

C# openoffice+jdk Excel、Word转PDF教程全套 包括openoffice自启服务生成状态_第1张图片

 环境变量

 C# openoffice+jdk Excel、Word转PDF教程全套 包括openoffice自启服务生成状态_第2张图片

 在“系统变量”里进行操作

 新建环境变量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 密码:bulv

 B:首先打开命令操作界面: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的位置出现目标文件,则表示目前转化部署已经完成

二、通过C#将Excel和Word文档转化成PDF文件

 1.请先下载需要引用的dll文件

  链接: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 deleteSheetName = new 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转换服务的生成和自启动

 1.承上

  接着第二大项第三点最后一句说,本来这个可以单独写一篇的,最后还是写在一起了,因为方便后面 的使用。在第二大项第三点的情况中,可能会出现一种错误情况,有可能系统不报错,但是没转化成功。如 果系统报错了,大概就知道问题的所在了,如果没报错的话,这里可以提供一个解决思路。回想一下装载了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端口是

否已被监听即可,附上本人成功图片

C# openoffice+jdk Excel、Word转PDF教程全套 包括openoffice自启服务生成状态_第3张图片


       好了,到这里本文就全部结束了。如果对你有帮助的话,记得点赞哦。如果想要深入交流,可以联系我哦




你可能感兴趣的:(.net,C#,ShellBakers,Openoffice+jdk)