• 关于

    poi处理excel

    的搜索结果

问题

POI SAX 如何修改大excel 文件内容

我现在要解析一个大的excel文件,直接用POI的方式会OOM,现在用POI SAX(事件驱动模式)问题解决了。但是现在处理完数据需要每行返回一个状态,添加到行末尾,其他数据格式保持原样。这个请问怎么处理?...
蛮大人123 2019-12-01 19:45:31 1425 浏览量 回答数 1

回答

尝试用 pageoffice 组件吧 POI处理Office2003的doc、xls文件和Office2007的docx、xlsx文件用的是接口完全不兼容的两组对象,POI用来解析.doc、.xls那部分的组件是残缺不全的并且也已经不再更新了。PageOffice提供Word、Excel的简化对象接口,功能齐全,读写文档的调用代码完全统一,并且调用代码比POI、JXL简单很多 从性能上看,POI使用的xml处理对象本身就消耗内存,它要把整个文档都加载到内存,加上其他开销,比实际Word、Excel文档还大,遇到打开较大的Word、Excel文档时,JVM很容易内存溢出。用PageOffice提取Word、Excel文档中的内容,40MB大小的文档没问题,100MB大小的文档也无压力。
游客ufivfoddcd53c 2020-01-03 19:44:52 0 浏览量 回答数 0

回答

写入excel,需要一个格子一个格子的填充数据, 直接放进去,没搞过###### 好了,文件名多写了个s,谢谢###### 弄一个模板,用${变量}方式进行填充。另外不要用这种方式,利用poi吧。###### 使用poi 的jar包 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> //获取Excel对象 public static Workbook workbook(){ InputStream inputStream= null; Workbook workbook=null; try { inputStream = new FileInputStream(path); workbook=WorkbookFactory.create(inputStream); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return workbook; } 然后调用workbook里面的方法进行操作,就可以了。最近我在做这个######感谢老兄ヽ(ー_ー)ノ###### 我当时这个处理情况是:通过ajax把大幅数据传到后台,然后查询出结果写入手动创建的excel中,最后返回一个路径链接,再通过window.local.href找到这个路径下文件,最后下载下来.比较麻烦,但是确实解决了携带大量查询条件查询结果后写入excel并下载出来的问题
kun坤 2020-06-08 15:25:14 0 浏览量 回答数 0

回答

首先,Java操作Excel数据可以用POI工具,然后就可以处理Excel数据了。其次,一般的Excel文件中表格第一行应该都是标题行,显示各个列名称的。真正的数据应该就是从第二行开始的。第三,Java操作Excel可以用odbc连接吗,可以分享一下吗?
蛮大人123 2019-12-02 02:45:33 0 浏览量 回答数 0

回答

多谢大家的回复,已经解决了,我用的是3.9版本的POI 原来这个文件好像在中间被人为的改过后缀,本来是xlsx的 被谁给改了,讨厌~~ 还有至于为什么程序在那空跑步继续下去,我之前都用的是WPS,打开excel没问题,但是用office打开的话就会提示有损坏!我另存为了一份,就OK了,程序一点问题都没有了顺利的读取! PS:office是王道啊!本来我也支持一下WPS的,谁知不给力啊! 多看看文档 以后这种模棱两可的话就不要评论了WorkbookFactory.create谢谢,已解决,是文件有问题。POI好像是有独立于excel版本的一套更上层的API。另外,或许你这个是csv格式呢。乱猜的你直接用kettel处理多好啊还有就是楼上说的用csv格式或者是你看看是不是excel有空的现象还有你用的包是什么版本贴出来和excel贴出来大家看看 @80的尾巴坑爹的问题啊!!!我以前生成excel的时候也是问题多多不过都解决了!谢谢,已解决,是文件有问题啊。你的POI什么版本,升级下?我用的3,.9最高的了 FileInputStreaminput=newFileInputStream(newFile(excelPath));POIFSFileSystemfs=newPOIFSFileSystem(input);HSSFWorkbookwb=newHSSFWorkbook(fs); 我的是这样的,上传EXCEL,读取内容。文件是标准的EXCEL2003 POI版本是3.7 谢谢,是文件的原因哈哈,我一看第一次就怀疑是xlsx改过来的。我以前玩过。。。
爱吃鱼的程序员 2020-06-20 16:44:52 0 浏览量 回答数 0

问题

POI读取EXCEL文件的错误(invalid header signature )处理

如题,网上很多说是获取信息头部出错,保存或者另存为就可以,我试了下的确可以,但是我不用保存,只要打开下或者重命名也能读取了,打开也没显示格式错误,更重要的是我功能是读取客户端的excel..不可能每次都手动操作,我现在实现的功能是用jsp的...
蛮大人123 2019-12-01 20:27:23 3309 浏览量 回答数 1

回答

poi只懂一部分excel的东西,简单处理点数据就好,如果要做复杂处理,还是用vba吧大致的需求没什么,就是验证excel中的数据是否满足需求,有问题的数据给批注下,关键是这个excel本身是设置了宏的,我输出就出现这种情况了,不知道是不是宏影响的
爱吃鱼的程序员 2020-06-08 20:03:42 0 浏览量 回答数 0

回答

多谢大家的回复,已经解决了,我用的是3.9版本的POI 原来这个文件好像在中间被人为的改过后缀,本来是xlsx的  被谁给改了,讨厌~~ 还有至于为什么程序在那空跑步继续下去,我之前都用的是WPS,打开excel没问题,但是用office打开的话就会提示有损坏!我另存为了一份,就OK了,程序一点问题都没有了顺利的读取! PS:office是王道啊!本来我也支持一下WPS的,谁知不给力啊! ###### 多看看文档 ######以后这种模棱两可的话就不要评论了######WorkbookFactory.create######谢谢,已解决,是文件有问题。######POI 好像是有独立于 excel 版本的一套更上层的API。 另外,或许你这个是 csv格式呢。 乱猜的######你直接用kettel处理多好啊 还有就是楼上说的用csv格式 或者是 你看看是不是excel有空的现象 还有你用的包是什么版本 贴出来 和excel贴出来 大家看看 ###### @80的尾巴 坑爹的问题啊!!! 我以前生成excel的时候也是问题多多 不过都解决了!######谢谢,已解决,是文件有问题啊。######你的POI什么版本,升级下?######我用的3,.9最高的了###### FileInputStream input = new FileInputStream(new File(excelPath)); POIFSFileSystem fs = new POIFSFileSystem(input); HSSFWorkbook wb = new HSSFWorkbook(fs); 我的是这样的,上传EXCEL,读取内容。文件是标准的EXCEL 2003 POI版本是3.7 ######谢谢,是文件的原因######哈哈,我一看第一次就怀疑是xlsx改过来的。我以前玩过。。。
kun坤 2020-06-06 16:35:21 0 浏览量 回答数 0

回答

首先先去http://poi.apache.org/faq.html :这个是个常用的问题列表,在I think POI is using too much memory! What can I do?This one comes up quite a lot, but often the reason isn't what you might initially think. So, the first thing to check is - what's the source of the problem? Your file? Your code? Your environment? Or Apache POI?Next, use the example program ToCSV to try reading the a file in with HSSF or XSSF. Related is XLSX2CSV, which uses SAX parsing for .xlsx我们看到了POI已经提出了针对这个问题的回答,而且正好在XLS2CSV中找到了很好的解决读取大容量的方法. 在XLS2CSV中,即使是读取300M的2007excel文件也没有什么问题,占用的内存也是可以接受的。在这段代码中的注释中写出了下面一段话: *Data sheets are read using a SAX parser to keep thememory footprint relatively small, so this should beable to read enormous workbooks. The styles table andthe shared-string table must be kept in memory. Thestandard POI styles table class is used, but a custom(read-only) class is used for the shared string tablebecause the standard POI SharedStringsTable growsvery quickly with the number of unique strings.大概的意思就是说通用的处理方法会快速消耗掉内存,所以采用了 SAX parser方法来处理大容量的文件. public void processSheet( StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream) throws IOException, ParserConfigurationException, SAXException { InputSource sheetSource = new InputSource(sheetInputStream); SAXParserFactory saxFactory = SAXParserFactory.newInstance(); SAXParser saxParser = saxFactory.newSAXParser(); XMLReader sheetParser = saxParser.getXMLReader(); ContentHandler handler = new MyXSSFSheetHandler(styles, strings, this.minColumns, this.output); sheetParser.setContentHandler(handler); sheetParser.parse(sheetSource); } 上面的一段代码是比较核心的代码,通过SAXParser解析xml文件,尽量不占用内存资源,从而达到读取大文件的目的。XLSX2CSV代码下载: http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
蛮大人123 2019-12-02 02:36:45 0 浏览量 回答数 0

问题

poi 处理10M的 07EXCEL 会读取不出来。。。求解:报错

XSSFWorkbook xwb = new XSSFWorkbook("e:\1.xlsx"); XSSFSheet sheet = xwb.getSheetAt(0); 这个EXCEL 10M...
kun坤 2020-06-07 16:15:14 0 浏览量 回答数 1

问题

poi文件读取(使用HSSFListener监听器):报错

项目中有Excel上传的功能以前Excel03使用的是HSSFWorkbook方式解析的。但是现在如果Excel达到上限的时候解析速度超慢。网上百度了一下原来可以使用HSSFListener进行解析。但是现在有一个问题使用HSSFListe...
kun坤 2020-06-07 16:08:09 0 浏览量 回答数 1

问题

python怎么去做excel的单元格拷贝从a文件拷贝到b文件指定的单元格,需要带格式:报错

我用java的poi做发现有些格式会覆盖掉,使用xml格式处理只能支持07以上,特来请教python能不能搞定这个?...
kun坤 2020-06-14 10:39:44 0 浏览量 回答数 1

回答

呵呵。。这些问题,我以前都是使用jacob 来实现的,但是不能跨平台。页眉页脚呀,页码,标题,缩进,表格,转换。等等都是可以的。######第六条的意思是,比如我打印一个很多页的我word,中间的页面布局有的是纵向的,有的是横向的~######ireport 复杂报表###### 引用来自“分流砥柱”的评论呵呵。。这些问题,我以前都是使用jacob 来实现的,但是不能跨平台。页眉页脚呀,页码,标题,缩进,表格,转换。等等都是可以的。 jacob没用过, 百度了一下, 貌似要使用dll文件, 感觉不太靠谱 而且我最想要实现的是第六点和第七点 ######第7个要求用很好实现的,使用dll和真实的操作word一样。为什么不靠谱?第6点不明白什么意思。###### java 的poi处理office都挺强大的... ###### 引用来自“Zemo”的评论 java 的poi处理office都挺强大的... poi只是操作Excel方便吧. 操作word只能读取插入简单的文本数据, 图片什么的不行啊######回复 @Zemo : 只能操作一些简单的,哎######不过我还真没处理过word 你可以试一下http://tiantianhappy.iteye.com/blog/1839998######官方说是可以的:https://poi.apache.org/document/index.html###### 引用来自“51weike”的评论ireport 复杂报表 报表  我是想要word ######除了最后一条,其它的应该都不是问题###### 引用来自“贝宝明”的评论除了最后一条,其它的应该都不是问题 请指教######请问你是如何生成目录的,给个思路
kun坤 2020-06-06 16:59:48 0 浏览量 回答数 0

回答

"jxls,不过不知道怎么设密码。话说这个工具好像在处理大量记录的时候力不从心。 ######真没见过怎么设置密码的。。继续关注。。######POI的这个方法可以做到 HSSFWorkbook.writeProtectWorkbook( String password, String username ) ######ls正解######<span style=""font-size:13.3333px;"">帮顶! <span style=""font-size:13.3333px;"">还有一种方法是直接使用SpreadJS这种类Excel控件,在里面直接编辑就好了,然后可以存成Excel文件类型。Excel里面的功能基本都支持啦,还不用写太多代码。可以设置导入导出时候的密码: <span style=""font-size:13.3333px;"">你看这个例子能不能解决你的问题:http://demo.gcpowertools.com.cn/spreadjs/exceliosample/exceliosample/"
montos 2020-06-04 22:31:32 0 浏览量 回答数 0

回答

直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。 别说我SB,这是专业做法。也就是所谓的转码器的工作。######这位同学估计是在说类似access,dbf这种小型数据库吧,可以直接按他的文件格式写,一般这种东西普通人都想到怎么往大型数据库里面导入######膜拜,还能这么搞######直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作. 我居然没读懂这句话。。。######还有这样的做法,太神了。完全没想到。。。。牛人啊######批量插入: com.jfinal.plugin.activerecord.Db.batch(......)######应该是想要将Excel当数据源select * into ……这样的答案吧。###### @Secret : 看你头像估计是JAVA的,做应用开发的,自然爽。我们做C的,整天就没白天黑夜的在底层折腾这种事情。你们如同豪华油轮上的侍者,虽然服务于民,但多少一样可以看到风景。我们是锅炉房里铲煤的,自然你们不知道昏天黑地里,还有一片火光。。。哈。 ######回复 @布谷鸟 : 桑那用工资??太亏了吧。银行的钱不借,傻哦。。哈。######嗯,你们领工资去桑拿按*摩的时候,我们忙着到银行还信用卡-_-//###### 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。###### 又是小倩风格.  execl文件是啥格式? 好吧, 这个也还可以有资料可以参考 , 毕竟有可以兼容execl的开源软件可以参考.  那数据库表文件呢, 去哪里可以看到oracle的数据文件是啥格式?哪里有这样的资料? ###### 引用来自“中山野鬼”的答案 直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。 别说我SB,这是专业做法。也就是所谓的转码器的工作。 用 win 的Com 接口, 直接调用 excel的接口, 导出csv 然后 想咋干就咋干 软件就是服务嘛 把Excel 当成工人看待 ###### 引用来自“布谷鸟”的答案 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。 jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi. ###### 引用来自“justin_cn”的答案 引用来自“布谷鸟”的答案 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。 jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi. From http://www.andykhan.com/jexcelapi/tutorial.html Memory Allocation and Sheet Caching For very large files, it was found that reading in the entire workbook led to horrendous performance. As of version 1.6, it was therefore decided to read in a sheet at a time. Every call to getSheet() frees up all the objects currently allocated in the current sheet and then reads in all the data from the next sheet. This alleviated the problems which previously occurred, but it does however assume that the giant size workbooks are spread over several sheets - if not, performance problems and OutOfMemoryExceptions may still occur.  A consequence of this is that if you are using the API to constantly flick between sheets in a large workbook, then this will result in adverse performance because every call to getSheet is causing ExcelRead to re-read and re-deduce all the data. It is recommended that ,if possible, the client application should do all their processing necessary on one sheet before progressing to the next.  The method getSheets(), which returns an array of all sheets, will still attempt to hold all sheets in memory at the same time. Use of this method for very large spreadsheets is not recommended.  ######直接 copy to啊 load进去啊 转换导入的格式,很快的。 跟 @中山野鬼 那速度差不多。
kun坤 2020-06-08 11:17:45 0 浏览量 回答数 0

回答

这问题,有水平!!! 这问题水平很高啊。你说的德龙资本是http://www.delongcapital.cn/这个吗? 用什么做的文件上传? 建议把你的问题描述清楚老哥 问题描述不清楚你做的是excel导入吧应该是没处理异常的抛出主要还是poi内部的异常数据异常像时间格式数字格式等不为空也会出异常 这个问题太深奥,一般人回答不出来 其实提的没错,人家是请高手指导下,你们不是高手所以。。。
爱吃鱼的程序员 2020-06-23 15:02:26 0 浏览量 回答数 0

回答

如果你们公司不差钱的话,推荐联系一下卓正志远,PageOffice可以定制开发这个功能,但是价格有点高,老板考虑成本问题,后来公司没做定制开发,放弃这个功能了。###### poi处理word之前用过,代码繁琐复杂,而且对word处理这块接口不完善,excel还相对好点,后来公司的一个项目有在线处理office的需求,用的产品就是楼上所说的PageOffice,个人感觉还是不错的呢,在线浏览,编辑,保存,导入,导出Office都很好用,集成也简单,楼主可以试试联系一下卓正公司,如果能定制的话,估计也不会差呢。 http://www.zhuozhengsoft.com
kun坤 2020-06-07 22:33:12 0 浏览量 回答数 0

回答

你插入的是2k7的,还是2k3的?######都插过 2003和2007我都试了 不知道怎么回事啊######文件路径也许是个问题######什么问题?###### 姐姐,你格式错了,你看你的文件是 xls 的(这是03格式),但是你读文件的时候使用了 2007的类 XSSFWorkbook , 改成 HSSFWorkbook ,相关的XSSF都改成 HSSF,也即是使用03配套的类库读取你的文件即可 ######真的不知道该怎么解决了....######我刚才也用这个读2010 也是这个错啊######文件路径给错了######没错啊 Copy来的######【 Microsoft Excel】  把中间的空格去掉试试######回复 @陈雨霖 :刚测试了, [insertDB()]这个方法,除了连接数据库,其余的都是OK的。######回复 @陈雨霖 : 【1、把这个文件发给我 jacarrichan@live.com; 2、把你的JDK路径贴一下; 3、poi哪个版本的? 】请提供下,谢谢。######回复 @JacarriChan : FileInputStream fileInput = new FileInputStream(filePath);; XSSFWorkbook workbook = new XSSFWorkbook(fileInput);//创建工作薄 就是创建工作簿这行代码报错######回复 @陈雨霖 : 1、把这个文件发给我 jacarrichan@live.com; 2、把你的JDK路径贴一下; 3、poi哪个版本的?######去掉了还是报这个错 真的不知道该怎么办了###### FileInputStream fileInput = new FileInputStream(filePath); XSSFWorkbook workbook = new XSSFWorkbook(fileInput); 把上面 的代码替换成下面的看看,我用的是poi-3.9-20121203版,没有问题呀,貌似在云端说的对,XSSF只能处理office2007以前版本: FileInputStream fileInput = new FileInputStream(filePath); HSSFWorkbook workbook = new HSSFWorkbook(fileInput); HSSFSheet sheet = workbook.getSheetAt(0); ###### is the version of xbean.jar correct? 异常提示请看!
kun坤 2020-06-06 16:27:31 0 浏览量 回答数 0

回答

package org.jeecgframework.poi.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.jeecgframework.poi.excel.entity.params.MergeEntity; /** * 纵向合并单元格工具类 * @author JueYue * @date 2015年6月21日 上午11:21:40 */ public final class PoiMergeCellUtil { private PoiMergeCellUtil() { } /** * 纵向合并相同内容的单元格 * * @param sheet * @param mergeMap key--列,value--依赖的列,没有传空 * @param startRow 开始行 */ public static void mergeCells(Sheet sheet, Map<Integer, int[]> mergeMap, int startRow) { Map<Integer, MergeEntity> mergeDataMap = new HashMap<Integer, MergeEntity>(); if (mergeMap.size() == 0) { return; } Row row; Set<Integer> sets = mergeMap.keySet(); String text; for (int i = startRow; i <= sheet.getLastRowNum(); i++) { row = sheet.getRow(i); for (Integer index : sets) { if (row.getCell(index) == null) { mergeDataMap.get(index).setEndRow(i); } else { text = row.getCell(index).getStringCellValue(); if (StringUtils.isNotEmpty(text)) { hanlderMergeCells(index, i, text, mergeDataMap, sheet, row.getCell(index), mergeMap.get(index)); } else { mergeCellOrContinue(index, mergeDataMap, sheet); } } } } if (mergeDataMap.size() > 0) { for (Integer index : mergeDataMap.keySet()) { sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), mergeDataMap.get(index).getEndRow(), index, index)); } } } /** * 处理合并单元格 * * @param index * @param rowNum * @param text * @param mergeDataMap * @param sheet * @param cell * @param delys */ private static void hanlderMergeCells(Integer index, int rowNum, String text, Map<Integer, MergeEntity> mergeDataMap, Sheet sheet, Cell cell, int[] delys) { if (mergeDataMap.containsKey(index)) { if (checkIsEqualByCellContents(mergeDataMap.get(index), text, cell, delys, rowNum)) { mergeDataMap.get(index).setEndRow(rowNum); } else { sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), mergeDataMap.get(index).getEndRow(), index, index)); mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); } } else { mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); } } /** * 字符为空的情况下判断 * * @param index * @param mergeDataMap * @param sheet */ private static void mergeCellOrContinue(Integer index, Map<Integer, MergeEntity> mergeDataMap, Sheet sheet) { if (mergeDataMap.containsKey(index) && mergeDataMap.get(index).getEndRow() != mergeDataMap.get(index).getStartRow()) { sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), mergeDataMap.get(index).getEndRow(), index, index)); mergeDataMap.remove(index); } } private static MergeEntity createMergeEntity(String text, int rowNum, Cell cell, int[] delys) { MergeEntity mergeEntity = new MergeEntity(text, rowNum, rowNum); List<String> list = new ArrayList<String>(delys.length); mergeEntity.setRelyList(list); for (int i = 0; i < delys.length; i++) { list.add(getCellNotNullText(cell, delys[i], rowNum)); } return mergeEntity; } private static boolean checkIsEqualByCellContents(MergeEntity mergeEntity, String text, Cell cell, int[] delys, int rowNum) { // 没有依赖关系 if (delys == null || delys.length == 0) { return mergeEntity.getText().equals(text); } // 存在依赖关系 if (mergeEntity.getText().equals(text)) { for (int i = 0; i < delys.length; i++) { if (!getCellNotNullText(cell, delys[i], rowNum).equals( mergeEntity.getRelyList().get(i))) { return false; } } return true; } return false; } /** * 获取一个单元格的值,确保这个单元格必须有值,不然向上查询 * * @param cell * @param index * @param rowNum * @return */ private static String getCellNotNullText(Cell cell, int index, int rowNum) { String temp = cell.getRow().getCell(index).getStringCellValue(); while (StringUtils.isEmpty(temp)) { temp = cell.getRow().getSheet().getRow(--rowNum).getCell(index).getStringCellValue(); } return temp; } } 之前版本模板没有合并单元格的属性,现在把那段功能提出出来了,你可以直接使用下  ######你好,请问下你用jxls怎么动态合并的单元格######不用这个了 我用了jxls实现了 感觉那个好用些######合并what?一列同样的数据吗?######类似这种效果 http://blog.csdn.net/hu_shengyang/article/details/6736816######全部显示 “一手”######你看第一张图的 “手别” 应该要合并的
kun坤 2020-06-09 09:30:53 0 浏览量 回答数 0

回答

1.需求 处理Excel 可以用jxl 或者poi 2需求 用户在系统上填写信息,保存后导出标准的word文档,用户在系统上填写的信息我们用富文本编辑工具kindEditor,这个插件可以将用户从word文档拷贝的表格标签保存,但是图片信息需要另行上传。 现在问题出来了,我们要将这些包含图片,表格,特殊符号的东东生成word文档。 如果是单纯的没有特殊格字符,图片等信息,如果要生成word文档的时候可以用Java+Freemark 模版的做法,具体作法 用word编辑好模版,将模版另存为 office 2003 xml 格式,然后打上相应的标签,最后将模版后缀改为.ftl即freemarker模版后缀即可。如果有内容中有图片,而且图片位置不固定,这样是需要用java + velocity 模版的做法,具体流程将编辑好的word模版另存为.mht即单网页文档。最后调整后缀为.vm即可。但是这个处理过程图片是保存不了的, 这个需要配合java2word。利用java+velocity 生成word文档,在往文档里面插入内容的时候可以用正则表达式替换图片标签为特殊的字符串,等到文档声称完毕后,采用java2word工具里面的查找替换功能将图片插入咱们内容加入的特殊字符位置。如果想要效果标准的word文档,可以用itext 我用的是itext 2.1.7 一共三个包,其中一个是亚洲包,这个是支持中文的,利用litext可以用代码画出标准的word文档,特别是对待分页以及表格格式要求严格的用户。上面说的java + velocity是临时方案,其实最简单的解决富文本编辑的问题时用插件,我们为客户购买了千航 即NTKO的office 编辑插件,我们买的是跨平台版的,这个插件可以让用户在线编辑word文档并将文档保存到数据库。但是用这个插件可能系统运行初期,需要花费很大精力去运维,因为用户电脑的环境不是咱们开发人员能够左右的,等到一个周期过去之后效果基本上会好起来。
小旋风柴进 2019-12-02 02:06:47 0 浏览量 回答数 0

回答

对于每个Cell,如果不是合并单元格中的Cell或者是合并单元格的第一个Cell,则处理该Cell的数据。######没明白呢,希望贴个例子 ###### String url=req.getSession().getServletContext().getRealPath("/"); String path = url+"\excelModel\tolls\beltwayPreferentialMonth.xls"; OutputStream ouputStream = null; HSSFWorkbook workbook= null;//接收到的报表对象 InputStream inputStream; try { inputStream = new FileInputStream(path); workbook = new HSSFWorkbook(inputStream); HSSFSheet sheet = workbook.getSheetAt(0); res.setContentType("application/vnd.ms-excel;"); res.setHeader("Content-disposition", "attachment;filename="+ new String(("绕城优惠情况月汇总.xls").getBytes("GB2312"), "ISO8859_1"));// 设定输出文件头 ouputStream = res.getOutputStream(); workbook.write(ouputStream); } catch (Exception e) { e.printStackTrace(); }finally{ try { ouputStream.flush(); ouputStream.close(); } catch (IOException e) { e.printStackTrace(); } }</pre> ###### 我自己实现了这功能:贴出代码给大家参考一下 import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.Region; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.struts.upload.FormFile; import com.boco.eoms.base.util.ApplicationContextHolder; import com.boco.eoms.base.util.StaticMethod; import com.boco.eoms.base.util.UUIDHexGenerator; import com.boco.eoms.commons.system.session.form.TawSystemSessionForm; import com.boco.eoms.partner.inspect.mgr.ICheckTemplateItemMgr; import com.boco.eoms.partner.inspect.model.CheckTemplateItem; import com.boco.eoms.partner.netresource.util.XLSToFormFileImport; import com.informix.util.stringUtil; import com.sun.syndication.feed.sse.Update; /**  * Description: 模板导入方法  * @author wyk  * @since 2016-09-08  *  */ public class CheckItemExcelUtil {            private POIFSFileSystem fs;       private HSSFWorkbook wb;       private HSSFSheet sheet;       private HSSFRow row;       private static List<String> findName = new ArrayList();       private static List<String> point = new ArrayList();       private static String dir;       private static String out;       public void dealExcel(FormFile file,HttpServletRequest request) throws Exception              {         try         {                List content = new ArrayList();           try {             this.fs = new POIFSFileSystem(file.getInputStream());             this.wb = new HSSFWorkbook(this.fs);           } catch (IOException e) {             e.printStackTrace();           }           //获得基础数据           String nowDate = StaticMethod.getCurrentDateTime();           String bigItemId=StaticMethod.null2String(request.getParameter("bigItemId"));//模板大项id           String templateId=StaticMethod.null2String(request.getParameter("templateId"));//模板项id           String specialty = StaticMethod.null2String(request.getParameter("specialty"));//自建专业字典           String templateType = StaticMethod.null2String(request.getParameter("templateFlag"));//类型           TawSystemSessionForm sessionForm = (TawSystemSessionForm) request.getSession().getAttribute("sessionform");           ICheckTemplateItemMgr service = (ICheckTemplateItemMgr) ApplicationContextHolder.getInstance().getBean("checkTemplateItemMgr");           for (int n = 0; n < wb.getNumberOfSheets(); n++) {//获取每个Sheet表               if("1124101".equals(specialty)){//配套                   //取第一个sheet                   n=0;               }               if("1124102".equals(specialty)){//不配套                   //取第二个sheet                   n=1;               }               if("1124103".equals(specialty)){//铁塔                   //取第三个sheet                   n=2;               }               if("1124104".equals(specialty) && "1124105".equals(specialty)){//室分及WLAN                   //取第四个sheet                   n=3;               }               if("1124106".equals(specialty)){//传输线路                   //取第⑤个sheet                   n=4;               }               if("1124107".equals(specialty)||"1124105".equals(specialty)){//集客家客                   //取第六个sheet                   n=5;               }               Map<String,Object> map = new HashMap<String,Object>();//map 存放所有的               Map<String,Object> map1 = new HashMap<String,Object>();//map1存放所有合并单元格的               sheet=wb.getSheetAt(n);//获取第几个sheet               int rowNum = this.sheet.getLastRowNum();//得到最后列数,用于循环               this.row = this.sheet.getRow(0);               //处理当前sheet所有的有合并的单元格               this.sheet.getNumMergedRegions();//获取所有合并过的单元格从0开始的(读取顺序为从上到下)               for(int num=0;num< this.sheet.getNumMergedRegions();num++){//第一个是合并的excel名称不需要管                          Region region = sheet.getMergedRegionAt(num);//得到这个合并单元格的对象                   String temp="";                   for (int row = region.getRowFrom(); row <= region.getRowTo(); row++) {                       for (short col = region.getColumnFrom(); col <= region.getColumnTo(); col++){                           temp= getCellFormatValue(this.sheet.getRow(region.getRowFrom()).getCell(col)).trim();//要将每个单元格的值都存为和第一个一样的就在读值的时候不变唯一的列标                           map1.put(row+"#"+col, temp);                           if (row ==0 && col==0) {                               map1.put(row+"#"+1, temp);                               map1.put(row+"#"+2, temp);                               map1.put(row+"#"+3, temp);                               map1.put(row+"#"+4, temp);                               map1.put(row+"#"+5, temp);                               break;                               }                           }                       }                   }               //System.out.println("map1的size为"+map1.size());               //按照正常的轮巡定位单个单元格               for (int i = 1; i < rowNum; i++) {                 this.row = this.sheet.getRow(i);                 for (int j = 0; j < this.row.getPhysicalNumberOfCells()-2; j++) {                   String temp = getCellFormatValue(this.row.getCell(j)).trim();                     point.add(i + "," + j);                     findName.add(temp);                     //System.out.println(i +1+ "," + (j +1)+ "         " + temp);                         map.put(i+"#"+j, temp);                     }               }                             map.putAll(map1);//得到每个sheet 的所有单元格的值               //System.out.println(map);               //反过来循环打印               CheckTemplateItem checkItem = new CheckTemplateItem();               //如果该条记录id 为null,就应该新增一条               String id="";               try {                 if(map.containsValue(" ")){                       //不存储报错哪一个单元格为空提示                       String value="";                       for(int k=1;k<rowNum;k++){                           for(int m =0;m<6;m++){                                value = StaticMethod.nullObject2String(map.get(k+"#"+m));                               if("".equals(value)){                                  System.out.println("第"+k+"行第"+m+"列数据为空");                               }                               if (" ".equals(value)) {                                   System.out.println("第"+k+"行第"+m+"列数据是空格");                               }else{                                   System.out.println("第"+k+"行第"+m+"列数据是"+value);                             }                           }                                                  }                   }else{//当这个单元格无空值的时候才存值                       for(int k=2;k<rowNum;k++){//第一列到第六列                           checkItem = service.geTemplateItemByCondition(map.get(k+"#0").toString(), map.get(k+"#1").toString(), map.get(k+"#2").toString(),templateType);                           if (checkItem.getId() ==null || checkItem.getId()=="") {                               id = UUIDHexGenerator.getInstance().getID();                               checkItem.setId(id);                               checkItem.setBigitemName(map.get(k+"#0").toString());//bigitemName 设备类别                               checkItem.setCheckItem(map.get(k+"#1").toString());//抽检项目                               checkItem.setRequirement(map.get(k+"#2").toString());//要求                               checkItem.setBigitemId(bigItemId);//模板大项id,记录归属的id                               checkItem.setTemplateId(templateId);                               checkItem.setAddTime(nowDate);                               checkItem.setAddUser(sessionForm.getUserid());                               checkItem.setStatus(1);                         }                           checkItem.setBasePoints(Integer.parseInt(map.get(k+"#3").toString().substring(0, map.get(k+"#3").toString().trim().length()-2)));//基分                           checkItem.setEvaluationStandards(map.get(k+"#4").toString());//评分标准                           checkItem.setAnotherName(map.get(k+"#5").toString());//别名                           service.save(checkItem);                                                  }                   }                 service.updateItemNum(templateId);             } catch (Exception e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             }             if(n>=0){                 break;             }           }         }         catch (Exception e)         {           System.out.println("读取文件内容出错");           e.printStackTrace();         }       }       /**获取单元格数据*/       private String getCellFormatValue(HSSFCell cell)       {         String cellvalue = "";         if (cell != null)         {           switch (cell.getCellType())           {           case 0:           case 2:             if (HSSFDateUtil.isCellDateFormatted(cell))             {               Date date = cell.getDateCellValue();               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");               cellvalue = sdf.format(date);             }             else             {               cellvalue = String.valueOf(cell.getNumericCellValue());             }             break;           case 1:             cellvalue = cell.getRichStringCellValue().getString();             break;           default:             cellvalue = " ";             break; }         } else cellvalue = "";         return cellvalue;       }        }
kun坤 2020-06-06 16:19:31 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务