分类 Web 下的文章

使用POI对Excel文件进行处理

标签:poi  excel 

前段时间,使用com对office的文档进行了parser
并提供了在线HTML版本的预览功能
初期在并发量不大的情况下,运行一切良好
但当并发量很大时,机器就受不了了,不停的报警
因为本身com调用就是耗内存又耗cpu的,并不适合大并发的请求
于是,开始考虑其它的第三方的库去解析Office文档
Aapache的POI应该算是比较“有活力”的一个开源的库
虽然它目前还不是很完善,不很成熟,但毕竟后边还是有一个开发组在维护更新

word里面可能包含的元素(图片,文档图....),格式,样式太复杂
要想使用POI来很少的处理它,还是有很大的难度的
Excel相对来说还是要简单一些,毕竟它里面主要还是以表格数据为主的
POI现在对Excel的支持还是挺好的,除了对Chart的支持不太好外,其它都还好吧

所以,定下了如下的处理规则:
1.读取Excel文件,构造一个HSSFWorkbook对象,如有异常,则说明该Excel文件已损坏或已加密,直接返回错误。
2.判断Excel文件中是否有图片,嵌入对象或者Chart,如有,则转发到后面的com接口上去处理
  System.out.println(wb.getAllEmbeddedObjects().size());
   System.out.println(wb.getAllPictures().size());
   System.out.println(wb.getSummaryInformation());
   System.out.println(sheet.getDrawingPatriarch().containsChart());
   System.out.println(HSSFChart.getSheetCharts(sheet).length);
   发现,POI并不能精确的判断出Excel中是否含有Chart,至少我测试,有些Chart它并不能识别出来。
3.若没有以上那些现象,则POI自己来进行解析处理,并最后生成对应的Html文件。

经过近2天的研究发现,POI本身对Excel的Parser做的还算比较彻底
然而,使用起来还是挺麻烦的,总感觉它里面的一些方法做的不好,使用起来不够方便
印象较深的就是它的Color的处理,太不人性化了,它只返回了一个自定义的short值,还得自己写方法进行转换
如果它直接就返回Color的Hex形式,对开发人员来说,不就简单多了吗?
不过,复杂归复杂,最终还是能从它提供的一大堆接口中构造出自己想要的东西的

明天,会详细的记录使用POI来将Excel文件转换为Html......

如何识别wap手机登录

现在邮箱除了Web版外,还有一个Wap版
为了能更友好的支持手机用户,同时减少不必要的流量
可以在用户输入web版邮箱url后,进行检测
如果发现是手机用户登录的话,则跳转到对应的Wap版
当然,前提是需要能检测出是手机登录浏览

大概有2种方式,要么检查Accept的header,要么就检查UserAgent
然而,通过log发现,很多手机浏览器的UA是null
所以,也只能通过Accept来大概区分一下

application/vnd.wap.xhtml+xml
application/vnd.wap.wmlc
text/vnd.wap.wml
text/vnd.wap.wmlscript
application/vnd.wap.wmlscriptc
以上几种header基本可以认为是手机登录邮箱

参考:
http://www.developershome.com/wap/detection/detection.asp?page=httpHeaders




Word的解析

标签:word  com  jacob 

前段时间,在邮件中要实现Word、Excel的在线预览功能,实际上就是需要把Office转成Html

于是乎,上网找找资料,其实总体上只有2种方法:

1.通过COM接口来调用office的组件,优点是简单,只要有台Windows机器,并且安装了Office接口。

2.通过一些其它的项目,如Apache POI、wordprocessingMl、Aspose word来完成解析,优点是不依赖word,效率比较高,缺点是调用麻烦,而且很难能支持word的表格、图表什么的。

最后,考虑了一下,还是决定先用com来实现,于是,很快的程序就写完并上线了

上线后,才发现,com的效率实在是很低,当有大量的并发请求时,一台Windows服务器根本就顶不住,无奈,后来又上了一台台式机,用apahce2做了一个简单的负载均衡,稍微好了一些,没有再大量的报警了

但,这毕竟不是一个长远的办法,以后有空,还是需要研究研究第二种方案

 

MemCached命令

1.  启动指令:/usr/local/bin/memcached -m 1024 -d -u root -c 4096 -p 11211


-m指定最大的存储空间,单位为M,默认为64M。


-c指定最大并发连接数,默认为1024。


2. set指令:set ysz 0 10 4 rntestrn



折叠复制代码




  1. set ysz 0 10 4

  2. test




说明:ysz为key,0为flags,memcached并没有明确flags的具体含义,由各client来自行实现,所以各client定义的flags可能是不一样的


10为10秒之后过期,4为存储的value的字节数


3. get指令:


get ysz rn


返回格式:



折叠复制代码




  1. VALUE ysz 0 4

  2. test

  3. END




ysz为存储的key,test为存储的value,0为flag,4为字节长度

Apache的UrlRewrite和Resin的配置问题

    最近有个需求,需要对项目的url进行规范,由于现有的url都是以.jsp结尾的,而且很多应用都在调用这个接口,所以只能保持原有的接口不变,而增加新的url,通过一定的映射来指向到旧的url。

    首先,很自然的就想到了使用Apache的UrlRewrite功能。  

    RewriteEngine  on
    RewriteRule  ^/test/index$ /index.jsp

    但实际的试验后,发现此方法行不通。因为Resin的mod_caucho模块只处理.jsp文件和servlet请求,而配置了UrlRewrite后,虽然url能重写了,但重写后的url却无法由resin处理了......

    上网Google了一把,发现了一个不错的东东,urlrewritefilter,是个开源的项目,专门在web application server中利用filter来实现url rewrite的。

    <filter>
            <filter-name>UrlRewriteFilter</filter-name>
            <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
            <init-param>
                <param-name>logLevel</param-name>
                <param-value>WARN</param-value>
            </init-param>
   </filter>
   <filter-mapping>
            <filter-name>UrlRewriteFilter</filter-name>
            <url-pattern>/test/*</url-pattern>
   </filter-mapping>

    下载安装后,如果只用Resin的话,运行很顺利,但如果和Apache协作起来,同样是有上面的问题。在urlrewrite.xml中配置的url rewrite根本无法处理(因为url首先被Apache给截取了).......

    继续Google,发现了Resin的一个隐蔽的配置,能将一个url配置成不由Apache处理,而是交给Resin来处理,在web.xml中增加:

    <servlet-mapping url-pattern='/test/*' servlet-name='plugin_match'/>

   这样的话,以/test/开头的url全部都交给了Resin来处理,然后由urlrewrite的filter进行重写,之后交给真正的jsp进行处理......

    至此上面的那个需求基本算是满足了.......

   

Ajax经验总结

1.解决IE的Cache问题:2种途径

  (1)前台在request对象上设置 setRequestHeader()

  req.setRequestHeader("If-Modified-Since","0");

<meta http-equiv=''Expires'' content=''-10''>
<meta http-equiv=''Pragma'' content=''No-cache''>
<meta http-equiv=''Cache-Control'', ''private''>

  (2)后台服务器端返回时,设置相应的http头.

 response.setHeader("Cache-Control", "no-cache");

 response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
  response.setHeader("Pragma","no-cache"); //HTTP 1.0
  response.setDateHeader ("Expires", 0); 

 response.setHeader ("Expires", 0); 
 或者
  SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd   MMM yyyy - HH:mm:ss z"); 
response.setHeader("Expires", dateFormat.format(new Date())); 

2.采用Ajax后,中文乱码的问题:

  WEB服务器采用了TOMCAT5.5,前台的一个JSP页面向后台的一个Servlet提交请求,然后Servlet将中文结果信息通过XML文件out.println到输出流中,结果在前台通过http_request.getresponseXML得到的是乱码.在Servlet中也增加了response.setContentType("text/xml;charset=GBK");但仍然是乱码.

   但这个问题在Resin服务器中就不存在,真郁闷死我了.

   后来只有在网上找了个Escape的JAVA版本,在输出前先Escape一下,然后,在前端的JAVASCRIPT得到数据后在Unescape一下就可以了.

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它