`
yq135314
  • 浏览: 255109 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读取word文件,字体,颜色

 
阅读更多

在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性。但由于需要,要把doc文档中的内容(字体,下划线,颜色等)读取应用到android中(不包括图片和图表)。

后面采用的是poi三方jar包(原包太大,可以从源代码里自己抽取有用的一些代码减少包的大小)。

我的想法是:把doc中的内容解析出来后,加上html对应的标签,在android中通过Html.fromHtml在TextView中进行显示,或者通过WebView.loadData进行加载显示

但测试后,发现如果加载太多内容的话,在Android中效率不行。

 

效果(该图的效果是在TextView中的效果,在WebView中效果会更好些):

doc图:

 

 

android图:

 

 

做法1:(解析为span样式的,这种做法只能用WebView方式加载,Html.fromHtml无效)

/**Span样式
	 * 通过字体的样式进行加载
	 * @param inputStream
	 * @return
	 */
	public static String readDocToSpanByRun(InputStream inputStream) {
		HWPFDocument hwpfDocument = null;
		if(inputStream == null)
			throw new RuntimeException("inputStream is null ...");
		try{
			hwpfDocument = new HWPFDocument(inputStream);
		}catch(Exception e) {
			throw new RuntimeException("HWPFDocment Exception", e);
		}
		Range allRange = hwpfDocument.getRange();
		int length = allRange.numCharacterRuns();
		StringBuffer sb = new StringBuffer();
		CharacterRun cur;
		String text = "";
		for (int i = 0; i < length; i++) {
			cur = allRange.getCharacterRun(i);
			sb.append(CharacterRunUtils.toSpanType(cur));
			text = CharacterRunUtils.getSpicalSysbomByRun(cur.text());
			if(cur.getSubSuperScriptIndex() == 1)
				sb.append("<sup>").append(text).append("</sup>");
			else if(cur.getSubSuperScriptIndex() == 2) 
				sb.append("<sub>").append(text).append("</sub>");
			else 
				sb.append(text);
			sb.append("</span>");
		}
		return sb.toString();
	}
	

 

做法2:(解析为font样式的,Html.fromHtml有效,但对应size的设置无效果)

 

/**
	 * Html样式
	 * 通过字体样式解析
	 * @param inputStream
	 * @return
	 */
	public static String readDocToHtml(InputStream inputStream) {
		HWPFDocument hwpfDocument = null;
		if(inputStream == null)
			throw new RuntimeException("inputStream is null ...");
		try{
			hwpfDocument = new HWPFDocument(inputStream);
		}catch(Exception e) {
			throw new RuntimeException("HWPFDocment Exception", e);
		}
		CharacterRun  cur = null;
		StringBuffer sb = new StringBuffer();
		StringBuffer charStr =  new StringBuffer();
		Range allRange = hwpfDocument.getRange();
		for(int i = 0; i < allRange.numCharacterRuns(); i++) {
			cur = allRange.getCharacterRun(i);
			sb.append(CharacterRunUtils.fontFaceColorSizeToHtml(cur));
			charStr.append(CharacterRunUtils.toSupOrSub(cur, CharacterRunUtils.getSpicalSysbomByRun(cur.text())));
			if(cur.isBold())  {
				charStr.insert(0, "<b>");
				charStr.insert(charStr.length(), "</b>");
			}
			if(cur.getUnderlineCode() != 0) { 
				charStr.insert(0, "<u>");
				charStr.insert(charStr.length(), "</u>");
			}
			if(cur.isItalic()) {
				charStr.insert(0, "<i>");
				charStr.insert(charStr.length(), "</i>");
			}
			if(cur.isStrikeThrough()) {
				charStr.insert(0, "<s>");
				charStr.insert(charStr.length(), "</s>");
			}
			sb.append(charStr).append("</font>");
			charStr.setLength(0);
		}
		hwpfDocument = null;
		return sb.toString();
	}
 

 以下是会用到的方法:

 

/**
 *处理字体相关的属性 
 */
public class CharacterRunUtils {

	private static final short ENTER_ASCII = 13;
	private static final short SPACE_ASCII = 32;
	private static final short TABULATION_ASCII = 9;

	/**
	 * 比对字体是否相同
	 * 可以继续加其它属性
	 * @param cr1
	 * @param cr2
	 * @return
	 */
	public static boolean compareCharStyleForSpan(CharacterRun cr1,
			CharacterRun cr2) {
		return cr1.isBold() == cr2.isBold()
				&& cr1.getFontName().equals(cr2.getFontName())
				&& cr1.getFontSize() == cr2.getFontSize()
				&& cr1.isItalic() == cr2.isItalic()
				&& cr1.getColor() == cr2.getColor()
				&& cr1.getUnderlineCode() == cr2.getUnderlineCode()
				&& cr1.isStrikeThrough() == cr2.isStrikeThrough()
				&& cr1.getColor() == cr2.getColor();
	}

	public static boolean compareCharColor(CharacterRun cr1, CharacterRun cr2) {
		return cr1.getFontName().equals(cr2.getFontName())
				&& cr1.getFontSize() == cr2.getFontSize()
				&& cr1.getColor() == cr2.getColor();
	}

	public static String getSpicalSysbom(char currentChar) {
		String tempStr = "";
		if (currentChar == ENTER_ASCII) {
			tempStr += "<br/>";
		} else if (currentChar == SPACE_ASCII) {
			tempStr += "&nbsp;";
		} else if (currentChar == TABULATION_ASCII) {
			tempStr += "&nbsp;&nbsp;&nbsp;";
		} else {
			tempStr += currentChar;
		}
		return tempStr;
	}
	
	public static String getSpicalSysbomSpan(char currentChar) {
		String tempStr = "";
		if (currentChar == ENTER_ASCII) {
			tempStr += "<br/>";
		} else if (currentChar == SPACE_ASCII) {
			tempStr += "&nbsp;";
		} else if (currentChar == TABULATION_ASCII) {
			tempStr += "&nbsp;&nbsp;&nbsp;";
		}
		return tempStr;
	}

	/**
	 * 特殊字符的取代
	 * @param currentChar
	 * @return
	 */
	public static String getSpicalSysbomByRun(String currentChar) {
		StringBuffer tempStr = new StringBuffer();
		int length = currentChar.length();
		for (int i = 0; i < length; i++) {
			tempStr.append(getSpicalSysbom(currentChar.charAt(i)));
		}
		return tempStr.toString();
	}

	/**
	 * span方式前缀
	 * @param cr
	 * @return
	 */
	public static String toSpanType(CharacterRun cr) {
		StringBuffer spanStyle = new StringBuffer("<span style='font-family:");
		spanStyle.append(cr.getFontName()).append("; font-size:")
				.append(cr.getFontSize() / 2).append("pt;");
		if (cr.isBold())
			spanStyle.append("font-weight:bold;");
		if (cr.isItalic())
			spanStyle.append("font-style:italic;");
		if (cr.isStrikeThrough())
			spanStyle.append("text-decoration:line-through;");
		if (cr.getUnderlineCode() != 0)
			spanStyle.append("text-decoration:underline;");
		spanStyle.append("color:")
				.append(ColorUtils.getHexColor(cr.getIco24())).append(";")
				.append("'>");
		return spanStyle.toString();
	}

	/**
	 * 为font方式提供<font前缀
	 * @param cr
	 * @return
	 */
	public static String fontFaceColorSizeToHtml(CharacterRun cr) {
		StringBuffer htmlType = new StringBuffer("<font ");
		htmlType.append("size='").append(cr.getFontSize() / 2).append("' ")
				.append("face='").append(cr.getFontName()).append("' ")
				.append("color='")
				.append(ColorUtils.getHexColor(cr.getIco24())).append("'>");
		return htmlType.toString();
	}

	/**
	 * 处理上下标
	 * @param cr
	 * @param currentChar
	 * @return
	 */
	public static String toSupOrSub(CharacterRun cr, String currentChar) {
		int sub = cr.getSubSuperScriptIndex();
		if (sub != 0) {
			if (sub == 1)
				// 上标
				return "<sup>" + currentChar + "</sup>";
			else
				// 下标
				return "<sub>" + currentChar + "</sub>";
		} else
			return currentChar;
	}

	public static String toSupOrSub(CharacterRun cr, char currentChar) {
		return toSupOrSub(cr, new String(new char[]{currentChar}));
	}
}

 

用到的颜色的转换(进行简单的颜色转换)

public class ColorUtils {

	public static int  red(int c) {
		return c & 0XFF;
	}
	
	public static int green(int c) {
		return (c >> 8) & 0XFF;
	}
	
	public static int blue(int c) {
		return (c >> 16) & 0XFF;
	}
	
	public static int rgb(int c) {
		return (red(c) << 16) | (green(c) <<8) | blue(c);
	}

	public static String rgbToSix(String rgb) {
		int length = 6 - rgb.length();
		String str = "";
		while(length > 0){
			str += "0";
			length--;
		}
		return str + rgb;
	}
	
	public static String getHexColor(int color) {
		color = color == -1 ? 0 : color;
		int rgb = rgb(color);
		return "#" + rgbToSix(Integer.toHexString(rgb));
	}
}
 

 

分享到:
评论

相关推荐

    java读取word文档内容以及字体大小和颜色

    java读取不同版本文档的内容以及字体大小,实现对文档格式进行匹配!

    VC 读取Word文档内容

    在VC++或MFC(Microsoft Foundation Classes)环境下,读取Word文档内容主要涉及到Microsoft Office的自动化接口,这通常使用COM(Component Object Model)技术来实现。以下是一个详细的知识点介绍: 1. **COM理解...

    通过thinkphp5+PHPOffice读取word文件写入到html文件

    接下来,我们需要创建一个ThinkPHP5的控制器来处理读取Word文件并写入HTML的过程。在控制器中,可以使用PHPWord提供的API来读取.docx文件,然后将其内容转换成HTML格式。以下是一个简单的示例代码: ```php ...

    PHPWord中文手册_Office_word_读取word_php_

    当我们需要处理Microsoft Word文档时,PHPWord库提供了一个强大的工具,使得开发者可以用PHP来读取、修改和创建Word文件。这个"PHPWord中文手册"正是针对这个需求,帮助开发者深入理解和实践PHP操作Word的各种功能。...

    npoi读取word

    在本文中,我们将深入探讨如何使用NPOI读取Word文档内容,为你的编程实践提供详尽的指导。 1. **NPOI简介** NPOI是.NET平台上对Apache POI的封装,后者是Java平台上的一个库,用于处理微软的Office文档。NPOI支持...

    易语言编辑框直接读入word文档源码

    在易语言中,编辑框(EditBox)通常用于接收或显示文本信息,而读取Word文档的内容则涉及到文件操作和文字处理。具体实现方法可能包括以下步骤: 1. **打开Word文档**:首先,我们需要调用易语言的系统API,例如`...

    读取word文本

    总的来说,通过NPOI库,我们可以轻松地在.NET 3.5环境中读取Word 2007及更高版本的docx文件,这对于需要处理大量Word文档的项目非常有用。这个示例展示了基本的读取操作,但NPOI的功能远不止于此,它还可以用于修改...

    Java POI读取word生成

    5. **样式管理**:POI还提供了对文档样式的控制,如字体、颜色、边框等,你可以通过XWPFStyles对象进行设置。 6. **写入文件**:最后,你需要将生成的文档保存到磁盘上。 ```java try (FileOutputStream out = new...

    使用Java读取Word文件的简单例子分享

    在Java编程中,读取Word文件通常涉及到处理复杂的文件格式,如.doc或.docx。这些文件格式的处理并不像读取文本文件那样直接,因为它们包含了丰富的格式化信息。在给定的例子中,由于对Apache POI库的限制和对其他库...

    qt操作word

    通过这些工具,我们可以读取Word文档的详细信息,并将这些信息转化为可读的字符串格式,存储到TXT文件中。在实际开发过程中,确保充分测试,以确保所有预期的功能都能正常工作,并且程序是健壮的。

    C# NPOI Word 读取

    例如,获取段落中的文本格式可以使用`XWPFRun`对象,它是段落中的文本单元,包含字体颜色、大小等信息。 5. 关闭资源:在操作完成后,别忘了关闭文件流: ```csharp document.Close(); ``` 在"WordFileRead"这个...

    word文档前端预览

    本文将深入探讨如何使用JavaScript插件在前端实现这一功能,同时兼顾服务器加载和本地文件预览,以及如何保留文档的原始样式和字体颜色。 首先,我们需要了解前端预览的核心技术。在浏览器环境中,由于安全限制,...

    java Apache poi 对word doc文件进行读写操作

    读取 Word .doc 文件有多种方法,但最常见的两种是通过 `WordExtractor` 和直接使用 `HWPFDocument`。 **通过 WordExtractor 读取文件**: `WordExtractor` 主要用于提取文本内容,包括文档的文本、页眉、页脚和元...

    PHPWord纯PHP库读写MicrosoftWord文档

    PHPWord支持设置文本的字体、大小、颜色、对齐方式等样式。例如,添加一个加粗的红色文本: ```php $section = $phpWord-&gt;addSection(); $paragraph = $section-&gt;add_paragraph("这是一个加粗的红色文本", ...

    C# Winform NPOI操作Word Excel

    1. **读取Word文档**:通过`Document`类,你可以打开并访问Word文档中的段落、页眉、页脚、图片等内容。 2. **修改段落**:可以使用`Paragraph`类来修改文档中的文本、字体、字号、颜色等属性,甚至插入或删除段落。...

    java实现两个word文件进行比较

    2. **读取Word文档**:使用`XWPFDocument`类打开两个Word文档,获取它们的段落(`XWPFParagraph`)列表。 3. **比较内容**:遍历两个文档的段落,逐行比较文本。这里可能需要考虑字体、字号、颜色等格式信息,但基本...

    C++操作word:插入文字、图片、表格,设置样式字体

    在C++编程中,操作Microsoft Word文档是一项常见的需求,尤其在自动化报告生成、数据导出等场景中。本文将深入探讨如何使用C++与Word交互,实现插入文字、图片、表格以及设置样式字体等基本功能。我们将基于Visual ...

    利用POI读取excel写入到word

    你可以根据需要格式化文本,如设置字体、大小、颜色等。 ```java run.setFontFamily("Arial"); run.setFontSize(12); run.setColor("000000"); ``` 5. **保存Word文档**:完成数据写入后,使用OutputStream将...

    android读取Word的Doc文件转为HTML格式

    4. **处理复杂格式和样式**:DOC文件可能包含复杂的格式和样式,如字体、颜色、对齐方式等。Apache POI提供了相应的API来获取这些信息,但转换为HTML时需要额外处理。例如,可以使用CSS来表示文本样式: ```java ...

    py源码实例Word-docx-读取word

    ### Python读取Word文档(docx)的关键知识点 #### 1. 使用Python库:`python-docx` `python-docx`是一个强大的第三方Python库,专门用于处理.docx文件。通过它,用户可以轻松地读取、修改或创建Word文档。安装这个...

Global site tag (gtag.js) - Google Analytics