java语言Office转html

Office开发工具Spire.office与WebOffice有何不同? 目录 产品简介 版本与支持 功能对比 目前政府信息化,办公自动化正如火如荼的进行,Microsoft Office Word作为办公软件必不可少的应用之一,已经成为日常工作中不可或缺的工作神器。作为一款文档处理、文字处理应用程序,office的使用已经深入人心,使用人数也是不断增长。Microsoft Office是办公文档中用的最普遍的一种公文载体,因此,办公自动化要切合实际,与现状相结合,在办公自动化系统中,如何与Microsoft Office文档结合,是很多软件开发公司一直在摸索的问题,为了 阅读详情

转换工具我选OpenOffice (版本4)+ jodconverter(版本3)。跨平台,完全免费。

这两样工具网上很容易下载到,转换代码也很简单。主要的工作是对转换形成的html代码进行加工。主要目的有二:

1.修正失真

2.清理掉冗余代码

处理html文本主要工具是正则表达式。不过正则也有局限,比如匹配标签对。网上找到一个匹配标签对的正则,复杂的让人抓狂。因此我写一个匹配标签对的类,它的功能可示例如下:

原文本:"<a><a></a><b><a></a></b><c></c></a>"

对标签a进行匹配后:"<a1><a2></a-2><b><a3></a-3></b><c></c></a-1>"

package office;

import java.util.List;

import tools.EasyRegex;
/*
 *  配对原理:一对标签之间嵌套的子标签,其开始标志数量和结束标志数量相等
 */

/**
 * 配对text文本中查找到的第一对tag标签,开始标志加id,结束标志加-id
 * 比如把<a></a> 标识为<a1></a-1>
 * @author IBM
 */
public class TagPair {
	int id = 0;
	String tag;
	public String result = "";
	
	/**
	 * @param text
	 * @param tag 标签名,使用小写
	 * @return
	 */
	public TagPair(String text,String tag,int id)
	{
		this.id = id;
		this.tag = tag;
		
		String re = text;
		
		int e =0;
		int s = 0;
		
		int i = re.indexOf(tag);

		while(i>=0){
			if(re.indexOf("<", i-1) == i-1){
				s++;
				if(s == 1){//indexOf大小写敏感特性这里正好为我所有,将标志过的标签转为大写,这样下次indexOf就不会再把它列入查找结果
					re = re.substring(0, i) + tag.toUpperCase()+ String.valueOf(id) + re.substring(i+tag.length());
				}
			}
			else if(re.indexOf("</", i-2) == i-2){
				e++;
				if(e == s){
					result = re.substring(0, i) + tag.toUpperCase()+ String.valueOf(id*-1) + re.substring(i+tag.length());
					break;
				}
			}
			i = re.indexOf(tag,i+tag.length());
		}
	}
	
	/**
	 * tag使用小写
	 * @param text
	 * @param tag
	 * @return
	 */
	public static String pair(String text,String tag)
	{
		//String re = toLowercase(text);//如果能保证标签都是小写形式可省略此步骤
		String re = text;
		int id = 1;
		TagPair tp = new TagPair(re,tag,id);
		
		while(tp.result.length() > 0){
			re = tp.result;
			tp = new TagPair(tp.result,tag,++id);
		}
		return re;
	}
	
	/**
	 * 大小写不敏感
	 * @param html
	 * @return
	 */
	public static String unPair(String html)
	{
		String re = html.replaceAll("(</?[a-gA-Gi-zI-Z]{1,8})(-?\\d{1,5})([^>]*?>)", "$1$3");
		return re;
	}

	public static String toLowercase(String html)
	{
		String re = html;
		EasyRegex reg = new EasyRegex("<[^>]+?>");
		List<String> ms = reg.matchs(re);
		for(String t : ms){
			re = re.replace(t, t.toLowerCase());
		}
		return re;
	}
}

OpenOffice (版本4)+ jodconverter(版本3)转换代码:

package office;
import java.io.File;
import java.util.List;

import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

import tools.EasyFile;
import tools.EasyRegex;

public class Office2html {

	/**
	 * 把office文件转换成html
	 * @param file office文件完整路径
	 * @param folder html文件及其包含资源存放路径
	 * @return 返回html纯文本内容
	 */
	public static String convert(String file)
	{
		OfficeManager officeManager = null;
		try{
			EasyFile f = new EasyFile(file);//这是我的一个工具类,对File进行了一下再包装,可用File类代替
			
			if(f.isExists()){
				String output = f.getFolder() +"/"+f.nameWithoutExt() +".html";
				
				DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();

		        config.setOfficeHome("C:\\Program Files\\OpenOffice 4");
		        officeManager = config.buildOfficeManager();
		        officeManager.start();
		        
				
		        OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
		        File outputFile = new File(output);

		        converter.convert(f.getFile(), outputFile);//转换
		        
		        String temp = EasyFile.readAllText(output, "GBK");
		        EasyFile.writeAllText(output, clearFormat(f.fileExt(),temp));
			}
			
	        return "";
		}
		catch(Exception e){
			e.printStackTrace();
			return "";
		}
		finally{
           if (officeManager != null) {
                officeManager.stop(); 
            }
		}
	}
	
	/**
	 * ext表示转换前文件类型扩展名
	 * @param ext
	 * @param html
	 * @return
	 */
	static String clearFormat(String ext,String html)
	{
		String content = html;
		try{
	        if(ext.equals("doc") || ext.equals("docx")){
				//去除多余span标签
				content = content.replaceAll("</?SPAN[^>]*?>", "");  
				content = content.replaceAll("<META[^>]+?charset=[^>]+?>", //设定网页编码
						"<HEAD>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");  
                                //设置内容宽度并居中(接近A4纸宽度)
				content = content.replaceAll("<BODY[^>]*?>", "$0\n<div style=\"width:800px;margin:0 auto;\">");  
				content = content.replaceAll("</BODY>", "</div>\n</BODY>");  
				content = content.replaceFirst("<BODY", "<BODY style=\"text-align:center;\" ");
				//让图片者水平居中
				content = content.replaceAll("<IMG([^>]+)ALIGN=[A-Z]{3,6}", "<IMG$1");  
				content = content.replaceAll("<IMG[^>]+?>", "<div align=\"center\">$0</div>");   
				//下面是找出所有带align属性的p标签,改为div(对齐属性在P标签里无效果)。不能把P全变成div,那样失真严重。

				content = TagPair.toLowercase(content);
				content = TagPair.pair(content, "p");
				
				EasyRegex reg = new EasyRegex("(?<=<p)\\d{1,5}(?=.+align=)",true);
				List<String> ls = reg.matchs(content);
				for(String s : ls){
					content = content.replaceFirst("<P"+s, "<div");
					content = content.replaceFirst("</P-"+s, "</div");
				}
				
				content = TagPair.unPair(content);
				content = content.replaceAll("line-height: 100%", ""); //这个属性败事有余,取消掉  
	        }
	        else{
	        	EasyRegex reg = new EasyRegex("<META[^>]+?charset=[^>]+?>");
	        	content = content.replaceFirst(reg.match(content),
	        			"<HEAD>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
	        	//excel中不设边框依然有浅灰色线,但生成html就啥也没有显得太苍白,所以刻意加上。
	        	if(content.indexOf("border-top:") < 0 && content.indexOf("border-left:")<0){
		        	reg = new EasyRegex("<TABLE[^>]+?>");
		        	content = content.replaceFirst(reg.match(content),//
		        			"<TABLE border=\"1\" bordercolor=\"#a0c6e5\" style=\"border-collapse:collapse;\">");
	        	}
	        }

		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	    return content;  
	}
}

注:word中的图片会被放到和html同位置文件夹下

经过这一番处理,生成的html文件凑和着能看了。但毕竟word和浏览器是不同的软件,对代码的解析有很多不一样地方。比如有的文本在word中显示居中,生成html就没这个效果了。这不是java转换的问题,是因为那段文本其实本就没有居中属性,word只是根据其上下文环境,把它给居中显示了,但浏览器显然没这样功能。

至于表格,由于其本身格式就比较固定,所以在html下表现出来和excel中差别不大。不过我也发现了一个bug,就是在转换一个较大的excel文件时,本来某单元格中只有一句话,结果转换出来后,此格中这句话重复了数十遍,这应该是openoffice或jodconverter的bug。


欢迎大家一起探讨、进步!

C#中HTML转Word的技术实现 C#(读作“C Sharp”)是一种由微软开发的现代、类型安全的面向对象的编程语言。自从2000年首次发布以来,C# 已成为.NET平台上的主导语言之一,广泛用于Windows应用程序、游戏开发、云服务以及各种跨平台解决方案的开发。C# 的语法和结构受C++和Java的影响,是一种强类型语言,支持多种编程范式,包括面向对象、泛型、函数式、声明式、组件式等。C# 有着丰富的库支持,特别是.NET框架中的各种类库,让开发者能够快速构建稳定、高效的应用程序。 阅读详情

相关推荐

Java在文档格式转换中的应用:Word和Excel转PDF、HTML教程

Word文档转换为PDF格式在企业文档处理和日常办公中是一项常见的需求。转换流程大体上可以分为以下几个步骤:打开Word文档对文档进行必要的格式和内容检查设置转换参数,比如页面边距、纸张大小等执行转换操作,生成PDF文档保存PDF文件,并进行最终的检查在当今的办公环境中,将Excel电子表格转换为PDF格式是常见的需求。PDF格式的文件以其跨平台的兼容性和文件格式的一致性而受到青睐。转换流程通常包括以下几个基本步骤:准备Excel文件。

weixin_35756690的博客 858

Office文档WEB端在线浏览(转换成Html)

最近在做了一个项目,要求是对Office文档在线预览。下面给大家分享一下我的方法。 1.第一种方法(不建议使用)我是在网上搜了一个利用COM组件对office文档进行转换,但是此方法必须要装Office办公软件,而且容易与电脑上的WPS冲突,还有一系列的版本问题。我电脑上装的是Office2010,没有装WPS,所以直接可以使用。具体方法如下: Microsoft Office14...

baigangrong5954的博客 577

excel转换html类(Excel2HtmlUtil的JAVA类)

这款EXCEL转换HTML利用PIO万能转换,来源与优快云网上资源,我只是吧所有JAR包和程序源码放在一起便于快速开发测试使用。本人测试整理好用。

Java 将Word转为HTML的方法

本文介绍如何在JAVA程序中将Word文档通过 Document.saveToFile() 方法转换为HTML文档。编辑代码前,参考如下环境配置,导入jar包。 【程序环境】 1. IntelliJ IDEA 2018( jdk 1.8.0) 2. 测试文档:Word 2013(.docx) 3. Jar包:Free Spire.Doc for Java 3.9.0 导入jar的两种方法: 方法1 :下载jar包到本地,解压,将本地lib文件夹下的Spire.Doc.jar导入Java程序,步骤如下:

m0_66876551的博客 1万+

office2html:将Office文件转换为html的节点模块

office2html 将Office文件转换为html的节点模块 需要安装unoconv 将Office文件(docx,pptx,xlsx)转换为html文档 用法: var office2html = require(office2html), generateHtml = office2html.generateHtml; generateHtml('test/test.pptx', function(err, result) { console.log(result); }); 测试: 将Office文档(docx,pptx,xlsx)放在测试文件夹中。

java实现office转html格式

java实现poi技术将Word、Excel、ppt文档转换成html格式(支持doc、docx、xls、xlsx、ppt、pptx)

Java使用poi将office文件转为html

一、前言 功能需求:上传office文档,并提供文件在线预览。 解决方案: 使用Aspose.cells.jar包,将文档转换为pdf格式; 使用libreOffice,将文档转换为pdf格式; 使用poi将文档转换为html格式。 方案一:通过Aspose的方式,该功能是付费版,需要破解,所以是能抛弃。 方案二,使用libreOffice,需要安装使用libreOffice,linux还需要装unoconv,需要使用commons-io的pom依赖,之前maven官方库查询不到这个pom依赖所以放弃

weixin_41377777的博客 1497

word2html

NULL 博文链接:https://shaozhen.iteye.com/blog/963465

Java Word 转 HTML 实践指南

在日常开发和办公中,我们经常需要将 Word 文档的内容展示在网页上。然而,直接在浏览器中显示 Word 文件通常会遇到排版错乱、样式丢失等问题。为了在 Web 环境中保留原文档的排版和结构,将 Word 转换为 HTML 就成为了一种常见而实用的解决方案。

SunnyDays1011的博客 777

Word2Html Demo

通过使用第三方工具,实现wor转换成excel,保留word中所有样式以及图片

word2html.zip

org.apache.batik.transcoder-1.6.0.jar和wmf2svg-0.9.0.jar

数据格式转换 (三)Office文档转HTML

HTML Filter 是由北京红樱枫软件有限公司依据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库。便于用户实现对多种文档的统一管理,编辑,检索和浏览。用户可以使用本产品,实现文档在线预览,十分便利的将附件中的Word,Excel,PPT文档转换为HTML,通过浏览器浏览HTML的内容。

449

多格式文档互转工具包:支持Word、HTML、Excel、PDF、JPEG与Markdown格式转换

该工具集提供多种文档格式间的双向转换功能,支持包括文本处理文档、网页文件、数据表格、便携式文档、图像文件及标记语言在内的六类常见格式相互转化。通过模块化设计实现了跨格式数据解析与重构,在保持原始内容完整性的同时,可精确转换文本样式、表格结构及页面布局等核心元素。其转换引擎采用分层处理架构,分别针对字符编码、视觉渲染和元数据保真度进行专项优化,确保在不同应用场景下均能维持较高的格式兼容性与内容还原度。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

基于java的格式转换,word 转 pdf、word 转图片、office 格式转换、在线文件预览

基于java的格式转换,word 转 pdf、word 转图片、office 格式转换、在线文件预览

MMKJSH的博客 565

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2549

基于AT32F421的紧凑型FOC电机驱动板设计

磁场定向控制(FOC)是永磁同步电机(PMSM)与无刷直流电机(BLDC)实现高精度转矩控制和高效运行的核心技术,其本质是通过Clarke/Park坐标变换解耦定子电流,实现d轴磁链与q轴转矩的独立调节。该技术依赖实时性严苛的电流采样、高精度位置反馈及确定性PWM生成,广泛应用于机器人关节、智能装备等中小功率伺服场景。国产Cortex-M4微控制器(如AT32F421)凭借集成ADC、高级定时器与DSP指令集,已成为低成本、高可靠FOC嵌入式实现的理想平台。本文围绕一款工程化FOC驱动板展开,涵盖低侧电流采

weixin_42510243的博客 701

Java语言实现word转PDF(10分钟解决)

前言: 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了。基本上涉及到Java操作office的时候就会想到POI和openoffice.这两种方案都是需要找各种jar包,然后用里面繁杂的api。关键是做出来的文件格式有各种各样的问题,有时生成的文件打不开,有时文档格式混乱。搞了好几天的需求终于实现了,最后看到效果那一刻。。。唉呀妈呀 脑瓜疼 脑瓜疼 此时就需要另辟新径了...

weixin_37904139的博客 8105

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+
上一篇: MySQL索引
下一篇: WinForm小心AutoSize属性!
大狗狗
博客等级 码龄19年 51粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值