- 浏览: 255109 次
- 性别:
- 来自: 上海
最新评论
-
aduovip:
博主, 这样做,列表还能通过下拉刷新,上拉加载 实现分页吗
ListView的横向滚动(带表头与固定列) -
aduovip:
赞,谢谢博主分享!
ListView的横向滚动(带表头与固定列) -
eddya:
超赞,谢谢分享!
ListView的横向滚动(带表头与固定列) -
a5601564:
public void jsonToObj(St ...
Java获取服务端Json数据 -
cyt1030:
如果在表格的头部 加上添加一个按钮 在点击按钮时动态添加的vi ...
ListView的横向滚动(带表头与固定列)
在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 += " "; } else if (currentChar == TABULATION_ASCII) { tempStr += " "; } 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 += " "; } else if (currentChar == TABULATION_ASCII) { tempStr += " "; } 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)); } }
发表评论
-
Retrofit反射修改baseUrl
2020-06-23 14:32 714背景:Android开发时,需要两个平台切换,项目中网络请 ... -
Intent
2014-04-08 00:08 0Intent 小记 1.在自己的应用程序中,利用第三方应用 ... -
Android 解压中文乱码
2014-03-21 12:24 4180背景:在java自带的ZipEntry解压含有中文名名文件 ... -
DatePicker月份字体大小,月份宽度,隐藏月份
2014-01-06 09:33 9305背景:DatePicker中的字体大了,或想隐藏月份,或想 ... -
android边栏菜单<上下左右四个方向>
2013-12-31 16:06 4014背景:项目中应用到边菜单栏,开源项目SlidingMenu ... -
图片热区点击之二(边界反弹,缩放,移动)
2013-12-31 14:51 4500背景:对图片的部分区域进行点击,响应相应的事件(可对图片进 ... -
用fragment 时出错
2013-06-06 17:46 01.在用support-v13时出错 java.lang. ... -
android 图片区域点击(图片热区)
2013-06-06 16:55 17924背景:在一张图片中,有时希望点击不同的区域时,有不同的表现 ... -
真机在Eclipse中File Explore无法显示
2013-06-03 09:47 2451背景:手机刷ROM后,连接Eclipse发现以前可以看见的F ... -
ListView的横向滚动(带表头与固定列)
2013-05-20 22:02 32737问题背景:在做图表展示的时候,ListView可以上下左右 ... -
事件的传递
2012-12-21 08:51 01、onInterceptTouchEvent()是用于 ... -
EditText多行文本自动换行
2012-07-25 23:05 32838背景:有的地方需要用到多行的文本输入框,但EditText在默 ... -
is not valid; is your activity running?
2012-06-21 17:02 0是由于有activity时依附于另一个activity的 ... -
申请android google map API key
2012-06-12 14:09 01.首先找到debug keystore位置: ... -
eclipse中导出sqlite时出错
2012-06-12 13:52 1366在Eclipse中导出sqlite时出错:Failed to ... -
android应用添加三方jar包出错
2012-05-08 00:01 1865场景:在进行添加三方jar包后,布署运行时出现ClassNot ... -
kill当前进程
2012-03-31 12:06 0android.os.Process.killPro ... -
Tabhost与popupwindow
2012-02-26 14:26 3475软件应用中,常看到一种效果是在点击更多时,弹出一更多的弹出框, ... -
Intent中的Flags
2012-01-04 17:26 0Activity有四种加载模式:standard(默认) ... -
layout_weight的解释
2012-01-04 14:52 0在layout_width設置為fill_parent的時候, ...
相关推荐
java读取不同版本文档的内容以及字体大小,实现对文档格式进行匹配!
在VC++或MFC(Microsoft Foundation Classes)环境下,读取Word文档内容主要涉及到Microsoft Office的自动化接口,这通常使用COM(Component Object Model)技术来实现。以下是一个详细的知识点介绍: 1. **COM理解...
接下来,我们需要创建一个ThinkPHP5的控制器来处理读取Word文件并写入HTML的过程。在控制器中,可以使用PHPWord提供的API来读取.docx文件,然后将其内容转换成HTML格式。以下是一个简单的示例代码: ```php ...
当我们需要处理Microsoft Word文档时,PHPWord库提供了一个强大的工具,使得开发者可以用PHP来读取、修改和创建Word文件。这个"PHPWord中文手册"正是针对这个需求,帮助开发者深入理解和实践PHP操作Word的各种功能。...
在本文中,我们将深入探讨如何使用NPOI读取Word文档内容,为你的编程实践提供详尽的指导。 1. **NPOI简介** NPOI是.NET平台上对Apache POI的封装,后者是Java平台上的一个库,用于处理微软的Office文档。NPOI支持...
在易语言中,编辑框(EditBox)通常用于接收或显示文本信息,而读取Word文档的内容则涉及到文件操作和文字处理。具体实现方法可能包括以下步骤: 1. **打开Word文档**:首先,我们需要调用易语言的系统API,例如`...
总的来说,通过NPOI库,我们可以轻松地在.NET 3.5环境中读取Word 2007及更高版本的docx文件,这对于需要处理大量Word文档的项目非常有用。这个示例展示了基本的读取操作,但NPOI的功能远不止于此,它还可以用于修改...
5. **样式管理**:POI还提供了对文档样式的控制,如字体、颜色、边框等,你可以通过XWPFStyles对象进行设置。 6. **写入文件**:最后,你需要将生成的文档保存到磁盘上。 ```java try (FileOutputStream out = new...
在Java编程中,读取Word文件通常涉及到处理复杂的文件格式,如.doc或.docx。这些文件格式的处理并不像读取文本文件那样直接,因为它们包含了丰富的格式化信息。在给定的例子中,由于对Apache POI库的限制和对其他库...
通过这些工具,我们可以读取Word文档的详细信息,并将这些信息转化为可读的字符串格式,存储到TXT文件中。在实际开发过程中,确保充分测试,以确保所有预期的功能都能正常工作,并且程序是健壮的。
例如,获取段落中的文本格式可以使用`XWPFRun`对象,它是段落中的文本单元,包含字体颜色、大小等信息。 5. 关闭资源:在操作完成后,别忘了关闭文件流: ```csharp document.Close(); ``` 在"WordFileRead"这个...
本文将深入探讨如何使用JavaScript插件在前端实现这一功能,同时兼顾服务器加载和本地文件预览,以及如何保留文档的原始样式和字体颜色。 首先,我们需要了解前端预览的核心技术。在浏览器环境中,由于安全限制,...
读取 Word .doc 文件有多种方法,但最常见的两种是通过 `WordExtractor` 和直接使用 `HWPFDocument`。 **通过 WordExtractor 读取文件**: `WordExtractor` 主要用于提取文本内容,包括文档的文本、页眉、页脚和元...
PHPWord支持设置文本的字体、大小、颜色、对齐方式等样式。例如,添加一个加粗的红色文本: ```php $section = $phpWord->addSection(); $paragraph = $section->add_paragraph("这是一个加粗的红色文本", ...
1. **读取Word文档**:通过`Document`类,你可以打开并访问Word文档中的段落、页眉、页脚、图片等内容。 2. **修改段落**:可以使用`Paragraph`类来修改文档中的文本、字体、字号、颜色等属性,甚至插入或删除段落。...
2. **读取Word文档**:使用`XWPFDocument`类打开两个Word文档,获取它们的段落(`XWPFParagraph`)列表。 3. **比较内容**:遍历两个文档的段落,逐行比较文本。这里可能需要考虑字体、字号、颜色等格式信息,但基本...
在C++编程中,操作Microsoft Word文档是一项常见的需求,尤其在自动化报告生成、数据导出等场景中。本文将深入探讨如何使用C++与Word交互,实现插入文字、图片、表格以及设置样式字体等基本功能。我们将基于Visual ...
你可以根据需要格式化文本,如设置字体、大小、颜色等。 ```java run.setFontFamily("Arial"); run.setFontSize(12); run.setColor("000000"); ``` 5. **保存Word文档**:完成数据写入后,使用OutputStream将...
4. **处理复杂格式和样式**:DOC文件可能包含复杂的格式和样式,如字体、颜色、对齐方式等。Apache POI提供了相应的API来获取这些信息,但转换为HTML时需要额外处理。例如,可以使用CSS来表示文本样式: ```java ...
### Python读取Word文档(docx)的关键知识点 #### 1. 使用Python库:`python-docx` `python-docx`是一个强大的第三方Python库,专门用于处理.docx文件。通过它,用户可以轻松地读取、修改或创建Word文档。安装这个...