填报表导出excel非可写单元格锁定问题
问题描述:
填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作。
报表导出为excel时,润乾导出excel包默认情况下不对excel单元格属性进行特殊修改,当导出的报表为填报表时,报表中设定的单元格可写属性并不能在导出后的excel中体现,也就是说无论是可写还是非可写的单元格都会在excel中变成普通单元格,而恰恰一些客户在导出excel后会对excel进行修改然后再将excel导入报表,这时候就必然需要导出后的excel中单元格的可写非可写属性要和报表中的一致,此时就需要导出excel的报表中的非可写单元格在excel中锁定。
解决思路:
通过Java类来操作excel文件每个单元格的属性是很容易实现的,我们这里用到了jxl这个java操作excel类来实现功能。
思路,不使用润乾提供的导出excel方法,直接通过自定义按钮调用java代码实现对导出非可写单元格的锁定:
在导出excel的过程中,要先遍历报表中的所有单元格取得所有数据。
在这个遍历过程中做一个操作,将遍历到的可写单元格存在一个数组里。
遍历完后用润乾导出excel类导出excel。
通过jxl类操作excel文件,从第二步中建立的数组中取出可以单元格,并设置这些单元格不锁定,其他的单元格设置为锁定。
部分代码如下(完整例子代码:附件中jsp文件夹exportExcel.jsp文件):
//计算报表
Engine enging = new Engine(rd, context);
IReport iReport = enging.calc();
//遍历单元格
int tRow = iReport.getRowCount();
int tCol = iReport.getColCount();
boolean flag = false;
ArrayList cellList = new ArrayList();
for (int r = 1; r <= tRow; r++) {
for (short c = 1; c <= tCol; c++) {
INormalCell iCell = iReport.getCell(r,(short)c);
InputProperty ip = iCell.getInputProperty();
if(ip!=null){
flag = ip.isWritable();
if(flag==true){
String[] pointArray =new String[2];
pointArray[0]=String.valueOf(r);
pointArray[1]=String.valueOf(c);
System.out.println(Arrays.asList(pointArray));
cellList.add(pointArray);
}
}
}
}
//生成Excel文件
String saveFile = request.getRealPath(“/reportFiles/”) + “/”+ reportFile + “.xls”;
ExcelReport eReoprt = new ExcelReport();
eReoprt.export(iReport);
FileOutputStream fos = new FileOutputStream(saveFile);
eReoprt.saveTo(fos);
fos.close();
//jxl锁定单元格
Workbook jxlwb=null;
WritableWorkbook book=null;
try{
jxlwb=Workbook.getWorkbook(new File(saveFile));
book=Workbook.createWorkbook(new File(saveFile),jxlwb);
WritableSheet sheet = book.getSheet(0);
for(int i=0;i<cellList.size();i++){
String[] point=(String[])cellList.get(i);
int rowNum =Integer.parseInt(point[0].trim())-1;
int colNum =Integer.parseInt(point[1].trim())-1;
//去除可写单元格锁定状态
WritableCell wCell = sheet.getWritableCell(colNum, rowNum);
CellFormat cf = wCell.getCellFormat();
WritableCellFormat wcf = new WritableCellFormat(cf);
wcf.setLocked(false);
wCell.setCellFormat(wcf);
}
//
打开sheet保护
sheet.getSettings().setProtected(true);
book.write();
}catch(Exception e){
}finally{
book.close();
jxlwb.close();
填报表导出excel非可写单元格锁定问题的更多相关文章
- 填报表导出excel后不可写的单元格处于锁定状态
填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对excel单 ...
- 使用poi导出Excel,并设定单元格内容类型,抛出异常
本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...
- NPOI导出Excel文件,对单元格的一些设置
HSSFWorkbook book = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); ISheet sheet = book.Cr ...
- 报表导出excel方式介绍
报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...
- excel中,一系列单元格中包含某一个字段的单元格数量?
excel中,一系列单元格中包含某一个字段的单元格数量?这个怎么写公式?如:A列单元格A1-A7的内容分别为 A.AB.BC.AC.CD.AD.EA,怎么数这一列中几个单元格的内容包含A字母? 任意单 ...
- 无法读取Excel中的数据单元格。有数据,但是读出来全是空值
C#读取Excel,取值为空的解决办法! C#读取Excel遇到无法读取的解决方法是什么呢?这样在C#读取Excel的过程中有很多问题,那么本文就向你介绍如何解决C#读取Excel遇到无法读取的解决方 ...
- C# 获取Excel中的合并单元格
C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...
- 读取Excel文件中的单元格的内容和颜色
怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...
- Excel表格如何保护单元格不被修改
Excel如何保护单元格不被修改 有时使用Excel时希望保护单元格不被修改,这可以叫做单元格的“写保护”即把光标定位在一个不允许输入数据的区域内时,是无论如何也无法在里面输入数据的.下面咱们就一起 ...
随机推荐
- 【BZOJ2082】【POI2010】Divine divisor 假的pollard-rho
题目大意:给你$m$个数$a_i$,定义$n=\Pi_{i=1}^{m}a_i$.将$n$分解质因数为$\Pi p_i^{k_i} $,$p_i$是质数.请输出$2^{max(k_i)}-1$,以及存 ...
- 社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)
转载请注明出处:http://www.cnblogs.com/bethansy/p/6890972.html 一.已知真实社区划分结果 1.NMI指数,互信息和标准化互信息 具体公式和matlab代码 ...
- Java之集合(二十一)LinkedTransferQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7505355.html 1.前言 本章介绍无界的阻塞队列LinkedTransferQueue,JDK7才提供了这 ...
- SQL中存储过程和函数的区别
转:https://www.cnblogs.com/jacketlin/p/7874009.html 本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个. 而函数是可以嵌入在s ...
- spring中获取applicationContext
常用的5种获取spring 中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象代码:ApplicationContext ac = new FileSystemXm ...
- docker-compose.yml样例(mysql主从+mycat读写分离)
Docker-compose.yml文件示例 1.mysql主从复制的docker-compose.yml文件 # cat docker-compose.yml version: '2' # 这个ve ...
- 通用数据库连接池-C3PO
C3PO是一个开放源代码的JDBC数据连接池实现项目,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.开源项目在使用:Hibernate,Spring,MYSQL等. 下载: h ...
- elasticsearch分析系列
http://www.opscoder.info/category/ElasticSearch/?page=2 https://www.jianshu.com/p/0908b9ee65fc https ...
- 前端性能优化---缓存篇SDK
1.把前端最常用的资源css.js存在本地1.1 前端缓存技术SessionStorage 优点:临时存储神器,关闭页面标签自动回收,不可以跨页面交互. 取值的时候有两种方法,一种是用session ...
- 手机浏览器_安卓_苹果手机Webview 中唤醒APP
Url scheme是iOS,Android平台都支持,只需要原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP.比如 <!-- 打开考拉APP首页 --> & ...