- 浏览: 253159 次
- 性别:
- 来自: 上海
最新评论
-
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 631背景:Android开发时,需要两个平台切换,项目中网络请 ... -
Intent
2014-04-08 00:08 0Intent 小记 1.在自己的应用程序中,利用第三方应用 ... -
Android 解压中文乱码
2014-03-21 12:24 4128背景:在java自带的ZipEntry解压含有中文名名文件 ... -
DatePicker月份字体大小,月份宽度,隐藏月份
2014-01-06 09:33 9270背景:DatePicker中的字体大了,或想隐藏月份,或想 ... -
android边栏菜单<上下左右四个方向>
2013-12-31 16:06 3976背景:项目中应用到边菜单栏,开源项目SlidingMenu ... -
图片热区点击之二(边界反弹,缩放,移动)
2013-12-31 14:51 4434背景:对图片的部分区域进行点击,响应相应的事件(可对图片进 ... -
用fragment 时出错
2013-06-06 17:46 01.在用support-v13时出错 java.lang. ... -
android 图片区域点击(图片热区)
2013-06-06 16:55 17837背景:在一张图片中,有时希望点击不同的区域时,有不同的表现 ... -
真机在Eclipse中File Explore无法显示
2013-06-03 09:47 2426背景:手机刷ROM后,连接Eclipse发现以前可以看见的F ... -
ListView的横向滚动(带表头与固定列)
2013-05-20 22:02 32673问题背景:在做图表展示的时候,ListView可以上下左右 ... -
事件的传递
2012-12-21 08:51 01、onInterceptTouchEvent()是用于 ... -
EditText多行文本自动换行
2012-07-25 23:05 32722背景:有的地方需要用到多行的文本输入框,但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 1332在Eclipse中导出sqlite时出错:Failed to ... -
android应用添加三方jar包出错
2012-05-08 00:01 1828场景:在进行添加三方jar包后,布署运行时出现ClassNot ... -
kill当前进程
2012-03-31 12:06 0android.os.Process.killPro ... -
Tabhost与popupwindow
2012-02-26 14:26 3419软件应用中,常看到一种效果是在点击更多时,弹出一更多的弹出框, ... -
Intent中的Flags
2012-01-04 17:26 0Activity有四种加载模式:standard(默认) ... -
layout_weight的解释
2012-01-04 14:52 0在layout_width設置為fill_parent的時候, ...
相关推荐
java读取不同版本文档的内容以及字体大小,实现对文档格式进行匹配!
qt操作word 功能:读取word文档信息,包括文字内容,大小,颜色,字体;样式;字符间距;目录 ,把信息转换成字符串输出到txt文件
VC++ 分析 word文档 的 简单程序 VC++ 分析 word文档 的 简单程序 读取word文档内容 显示出来 读取字体颜色 字号,将读取内容保存到文本文件,
对word操作,画表格,在单元格设计特别的字体颜色等等,具体教程请搜博客,标题
签名及签字对文档内容、文档字体颜色以及文档字体大小敏感,也就是说:修改文档内容、文档中任意字的字体颜色或大小,都会导致文档签名失效。这是个很重要的功能,不知大家有没有意识到。试想一下,如果对合同签字,...
软件功能强大,支持读取并编辑*.rtf *.doc *.docx *.cod *.txt等数种格式的文档,支持命令行,,并且软件的界面可以按照你的意愿自定义。Atlantis Word Processor使用方便,应用速度快,质量高,对于用户来说是一款...
例如,猛mm象会将Heading 1样式的任何段落转换为h1元素,而不是尝试完全复制Heading 1的样式(字体,文本大小,颜色等)。 .docx使用的结构与HTML的结构之间存在很大的不匹配,这意味着对于较复杂的文档而言,这种...
PHPWord是一个用纯PHP编写的库,它提供了一组用于读写不同文档文件格式的类。 当前版本PHPWord支持Microsoft (OOXML或OpenXML),OASIS(OpenDocument或ODF),(RTF),HTML和PDF。 PHPWord是根据的条款许可的...
可以自定义文档字体颜色4. 可以自定义文档背景5. 记录并自动恢复上次已调整的字体大小#### github地址[ https://github.com/WeinanHu/WNDocWebViewController ]...
主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程...文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表应用、动画处理技术、音频与视频控制...
在模板设计过程中,您可以考虑包括公司标识、颜色方案、字体选择等元素,以确保名片卡的专业外观和一致性。接下来,使用xlrd模块来读取Excel文件中的名片信息。通过xlrd,您可以轻松访问和提取Excel文件中的数据,为...
2、若各位项目需求与本资源的样式相符度低,例如业务有渲染单元格颜色的,或者要求字体加粗,或者写入到多个Sheet页,或者设置列宽、行高,或者合并单元格,或者自动列宽,或者插入批注,或者读取Excel数据,又或者...
打开文档时会尽量保留原始信息:字体颜色、字体大小、字形等等。 一、该软件中Exel的特性: 1.可以打开并保存为原生Excel文档 2.包含了常用函数(科学、财务、常数、日期和时间、查找、加减等) 3.支持多重表和表间...
Windows窗体中的RichTextBox控件用于显示,输入和操作格式化的文本,RichTextBox除了拥有TextBox控件的所有功能外,还可以显示字体,颜色,链接,从文件中读取和加载图像,以及查找指定的字符。RichTextBox控件通常...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
支持从外置存储卡上直接读取、编辑文件 3.支持PalmOS 5 4.无Microsoft Word无缝整合 5.拼写检查程序和辞典功能 6.提供多平台的辅助转换工具 7.支持与PrintBoy配合打印文件 8.支持剪切、复制、粘贴、多重粘贴、全选、...