起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 36657|回复: 20

Excel导入时校验数据

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2012-8-21 10:13:21 | 显示全部楼层 |阅读模式
在导入excel前action(importExcelBeforeAction)的执行后事件中,获得导入的excel和mapping文件,写java遍历excel将不应导入的行删除或修改即可

做法如下
1、在构建路径中添加/SA/excel/logic/code下的jar包
2、在process中引用/SA/excel/logic/action和/SA/excel/logic/code目录
3、在动作设置中添加importExcelBeforeAction的执行后事件,代码如下
4、在w文件的excel导入组件的action属性中选择/SA/excel/logic/action/importExcel

示例:获得excel某个单元格的值,以及mapping文件中自定义的节点信息

  1. import org.apache.poi.ss.usermodel.Cell;
  2. import org.apache.poi.ss.usermodel.Row;
  3. import org.apache.poi.ss.usermodel.Sheet;
  4. import org.apache.poi.ss.usermodel.Workbook;
  5. import com.justep.excel.ImportConfig;
  6. import com.justep.model.ModelUtils;

  7. public class ExcelProcess {
  8.         public static void excelProcessAfterImportExcelBeforeAction() {
  9.                 System.out.println("导入前");
  10. //获得excel文件
  11.                 Workbook workBook = (Workbook)ModelUtils.getRequestContext().getActionContext().getParameter("excel");
  12.                 Sheet sheet = workBook.getSheetAt(0);
  13.                 Row row = sheet.getRow(1);
  14.                 Cell cell = row.getCell(1);
  15.                 System.out.println("excel 第二行第二列" + cell.toString());
  16.                
  17. //获得mapping文件
  18.                 ImportConfig importConfig = (ImportConfig)ModelUtils.getRequestContext().getActionContext().getParameter("config");
  19.                 System.out.println("是否覆盖" + importConfig.cover());
  20. //其中cover方法是自定义的方法,下面有介绍
  21.         }
  22. }
复制代码


如果需要增加自定义的参数,可以在Mapping文件中增加如下划线的部分

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mapping>
  3.         <default-config>
  4.                 <sheet all="false" start="1" end="1"/>
  5.                 <row all="false" start="2" end="6"/>
  6.         </default-config>
  7.         <concept name="DEMO_TABLE1">
  8.                 <relation name="fString" cell-number="1"/>
  9.                 <relation name="fInteger" cell-number="2"/>
  10.                 <relation name="fFloat" cell-number="3"/>
  11.                 <relation name="fDecimal" cell-number="4"/>
  12.                 <relation name="fDate" value-type="date" cell-number="5"/>
  13.                 <relation name="fDateTime" value-type="datetime" cell-number="6"/>               
  14.         </concept>
  15.         [U]<options cover="1"/>[/U]
  16. </mapping>
复制代码


获得mapping文件中的节点值,修改/BIZ/SA/excel/logic/code/src/com/justep/excel/ImportConfig.java,增加如下方法。修改这个文件后,需要进行模型编译,再重启tomcat

  1.         public String cover() {
  2.                 Element E = mappingE.element("options");
  3.                 if (null != E) {
  4.                         return E.attributeValue("cover");
  5.                 }
  6.                 else
  7.                         return "0";
  8.         }
复制代码


其它更多方法,参照 /BIZ/SA/excel/logic/code/src/com/justep/excel/ImportGenerator.java(例如 public Object generate方法),这是导入excel的java代码,例如:遍历excel、获得mapping中的信息等

评分

参与人数 1威望 +2 收起 理由
M1cseven + 2 很给力!

查看全部评分

11

主题

1134

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
QQ
发表于 2013-7-29 10:20:06 | 显示全部楼层
本帖最后由 song_ning_ning 于 2013-7-29 15:42 编辑

下面是实现对Excel数据校验的例子

做法如下:
1、在构建路径中添加/SA/excel/logic/code下的jar包
2、在process中引用/SA/excel/logic/action和/SA/excel/logic/code目录
3、在动作设置中添加importExcelBeforeAction的执行后事件,代码如下
4、在w文件的excel导入组件的action属性中选择/SA/excel/logic/action/importExcel


imprtExcelBeforeAction 的执行后事件,代码如下:
  1. Workbook workBook = (Workbook)ModelUtils.getRequestContext().getActionContext().getParameter("excel");
  2. Sheet sheet=workBook.getSheetAt(0); //获得sheet1表
  3. for(int i=0;i<=sheet.getLastRowNum();i++){ //对行进行循环
  4.                  Row row=sheet.getRow(i);
  5.                   Cell cell=row.getCell(1);
  6.                   //根据每行第二列的值判断是否导入这行数据   import.mapping.xml里对应的为relation name="FINTEGER" cell-number="2" check="true"/>
  7.                   //注意:check="true" 必须加在要删除列所对应的relation上
  8.                   //check: excel中行数据是否有效判断,当check="true"时cell-number对应列值为空,认为此行数据无效将被忽略
  9.                   if(cell.getNumericCellValue()>100){  //如果值大于100 对应这行的值就不导入   
  10.                         row.removeCell(cell);
  11.                   }   
  12. }
复制代码
import.mapping.xml  代码如下  只需要在relation节点 增加Check=“true” 就行
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mapping>
  3. <default-config>
  4.          <sheet all="false" start="1" end="1"/>
  5.          <row all="false" start="1" end="6"/>
  6. </default-config>
  7. <concept name="Demo_table1">
  8.            <!-- <primary-key>-->
  9.            <!-- <key-value cell-number="1"/>-->
  10.            <!-- </primary-key>-->
  11.            <relation name="FSTRING" cell-number="1"/>
  12.            <relation name="FINTEGER" cell-number="2" check="true"/>
  13.            <relation name="FFLOAT" cell-number="3"/>
  14.            <relation name="FDECIMAL" cell-number="4"/>
  15.            <relation name="FDATE" value-type="date" cell-number="5"/>
  16.            <relation name="FDATETIME" value-type="datetime" cell-number="6"/>
  17. </concept>
  18. </mapping>
复制代码
远程的联系方法QQ2025089647。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要

99

主题

546

帖子

629

积分

高级会员

Rank: 4

积分
629
QQ
发表于 2014-12-1 14:29:03 | 显示全部楼层
liuyi 发表于 2014-10-30 15:19
下面这两步,在开发环境里面具体怎么操作呢?在哪儿添加,在哪儿引用呢?
1、在构建路径中添加/SA/excel/lo ...

点X5平台右上的java   

然后BIZ层会出现  jre系统库(jdk)  然后点右键构建

然后添加jar 然后加入指定路径包就可以了   

397

主题

2437

帖子

4887

积分

论坛元老

Rank: 8Rank: 8

积分
4887
QQ
发表于 2013-11-22 16:36:10 | 显示全部楼层
本帖最后由 67886387 于 2013-11-22 16:47 编辑
song_ning_ning 发表于 2013-7-29 10:20
下面是实现对Excel数据校验的例子

做法如下:

你好,我想问一下,在导入后数据校验能否给出界面提示的功能?例如你的代码里面如果大于100时数据不导入,能否做出大于100时能在界面上做出提示?提示后并且终止这次的导入
QQ67886387

11

主题

1134

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
QQ
发表于 2013-11-27 15:50:05 | 显示全部楼层

导入excel时对excel中是否有重复数据校验

本帖最后由 song_ning_ning 于 2013-11-27 15:56 编辑


这种校验是防止excel中有多条重复的数据导入到数据库中(区别于excel中数据重复导入数据库中已有的数据)
  1. public static void import_excelProcessAfterImportExcelBeforeAction() {
  2.                 System.out.println("导入前");
  3.                 Workbook workBook=(Workbook) ModelUtils.getRequestContext().getActionContext().getParameter("excel");
  4.                 Sheet sheet=workBook.getSheetAt(0);
  5.                 List list=new ArrayList();//存放excel鉴别列的数据
  6.                 for(int i=1;i<=sheet.getLastRowNum();i++){
  7.                         Row row=sheet.getRow(i);
  8.                         Cell cell=row.getCell(0);//根据excel表中第一列数据进行校验
  9.                         if(list.contains(cell.getStringCellValue())){
  10.                                 row.removeCell(cell);//如果list存在和鉴别列相同的数据就删除
  11.                         }else{
  12.                                 list.add(cell.getStringCellValue());//如果不存在就添加到list
  13.                         }
  14.                 }
  15.         }
复制代码
远程的联系方法QQ2025089647。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要

10

主题

49

帖子

179

积分

初级会员

Rank: 2

积分
179
发表于 2013-11-30 20:53:51 | 显示全部楼层
song_ning_ning 发表于 2013-11-27 15:50
这种校验是防止excel中有多条重复的数据导入到数据库中(区别于excel中数据重复导入数据库中已有的数据) ...

区别于excel中数据重复导入数据库中已有的数据:这种情况如何处理?当要导入的数据在数据库已存在时,能否提示出哪一条记录已存在,谢谢

11

主题

1134

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
QQ
发表于 2013-12-2 08:46:27 | 显示全部楼层
lishappy 发表于 2013-11-30 20:53
区别于excel中数据重复导入数据库中已有的数据:这种情况如何处理?当要导入的数据在数据库已存在时,能 ...

根据你的鉴别字段去数据库查找 如果存在 removeCell  不存在就导入  提示哪一个条数据已存在这个目前还未实现
远程的联系方法QQ2025089647。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要

6

主题

14

帖子

52

积分

初级会员

Rank: 2

积分
52
QQ
发表于 2013-12-18 17:13:47 | 显示全部楼层
好东西,学习了

5

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
QQ
发表于 2013-12-19 09:00:18 | 显示全部楼层
我想问一下,怎么才能删除整行, 而不是说单独的这一列, 比如我判断这行某个字段是是null  就不导入这行 。

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
QQ
发表于 2014-10-30 15:19:51 | 显示全部楼层
下面这两步,在开发环境里面具体怎么操作呢?在哪儿添加,在哪儿引用呢?
1、在构建路径中添加/SA/excel/logic/code下的jar包
2、在process中引用/SA/excel/logic/action和/SA/excel/logic/code目录
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-23 19:22 , Processed in 0.082853 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表