问题描述:

填报表单元格分为可写和不可写两种状态,当填报表在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非可写单元格锁定问题的更多相关文章

  1. 填报表导出excel后不可写的单元格处于锁定状态

     填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对excel单 ...

  2. 使用poi导出Excel,并设定单元格内容类型,抛出异常

    本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...

  3. NPOI导出Excel文件,对单元格的一些设置

    HSSFWorkbook book = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); ISheet sheet = book.Cr ...

  4. 报表导出excel方式介绍

     报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...

  5. excel中,一系列单元格中包含某一个字段的单元格数量?

    excel中,一系列单元格中包含某一个字段的单元格数量?这个怎么写公式?如:A列单元格A1-A7的内容分别为 A.AB.BC.AC.CD.AD.EA,怎么数这一列中几个单元格的内容包含A字母? 任意单 ...

  6. 无法读取Excel中的数据单元格。有数据,但是读出来全是空值

    C#读取Excel,取值为空的解决办法! C#读取Excel遇到无法读取的解决方法是什么呢?这样在C#读取Excel的过程中有很多问题,那么本文就向你介绍如何解决C#读取Excel遇到无法读取的解决方 ...

  7. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  8. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  9. Excel表格如何保护单元格不被修改

    Excel如何保护单元格不被修改  有时使用Excel时希望保护单元格不被修改,这可以叫做单元格的“写保护”即把光标定位在一个不允许输入数据的区域内时,是无论如何也无法在里面输入数据的.下面咱们就一起 ...

随机推荐

  1. vue、react、angular三大框架对比 && 与jQuery的对比

    前端当前最火的三大框架当属vue.react以及angular了. 但是在做项目的时候,我们怎么去选择呢?  这里做一个比较,希望大家可以有一个比较清晰的认识. vue与react vue和react ...

  2. EF基础知识小记四(数据库=>模型设计器)

    EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...

  3. WebService-01-使用jdk发布第一个WebService服务并调用

    Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...

  4. python基础笔记之面向对象

    # class Foo:# name="kevin"## def __init__(self,puppy):# self.tomato= 'red'# self.dog = pup ...

  5. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  6. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

    前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...

  7. 短视频APP是如何开启你的美好生活的?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯视频云终端团队发表于云+社区专栏 常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ. ...

  8. 【转】Navicat Premium 12破解方法

    来源网址:https://www.jianshu.com/p/42a33b0dda9c 1.按步骤安装Navicat Premium,如果没有可以去官网下载:http://www.navicat.co ...

  9. 小白学习之Code First(二)

    Code First约定: 注:EDMX模板 (SSDL:存储模型=>数据库表 ,CSDL:概念模型=>实体,C-S模型=>存储和概念模型之间的映射关系) System.Data.E ...

  10. Emgucv(二)Emgucv和Aforge录制视频

    一.Emgucv录制视频 Emgucv中的Capture类可以完成视频文件的读取,利用EmguCV播放视频的原理是:将视频看作图片,用capture获取抓取通道,通过不断的调用{frame = cap ...