登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

杨柳千丝,绊惹春风

普通人日记

 
 
 

日志

 
 
关于我

性格还算开朗,为人还算不错。 长相一般,身高一般,能力一般,人是一般。 不会浪漫,不会情调,不会唱歌,不会跳舞,不会吸烟,不爱喝酒,不会开车,爱听老歌

grails操作excel  

2010-10-27 16:04:59|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

grails操作excel

一、安装grialsexcel插件

1.查找插件:

运行grails list-plugins 命令,列举出所有可用的插件(需联网),查找到:


......

excel-import        <0.3>            --  Excel Importer Using Apache POI

......


2.安装插件

       安装插件的命令是:grails install-plugin [NAME] [VERSION]

[NAME]:插件名

[VERSION]:要安装插件的版本

       需要注意的是,该命令必需在安装插件的project目录下运行该命令。安装excel插件命令是:

grails install-plugin excel-import 0.3

运行后可以看到:Plugin excel-import-0.3 installed,安装成功。

插件安装目录:

C:\Documents and Settings\Administrator\.grails\1.3.5\projects\YourProjectName\plugins\excel-import-0.3

二、使用excel插件

1.查找帮助

查看帮助命令:grails plugin-info excel-import

可以看到提示到:http://grails.org/plugin/excel-import 去看详细帮助。

2.使用过程

如果你能看懂这个老外写的,比我要强多了,我看得是一头雾水。还好,在后面把例子列举出来了,如只有前面的介绍我肯定要撞墙。结合例子,回头再来看前面的介绍。

       我是直接把例子放到一个测试project中,在运行效果中学习操作excel用法。

1)在安装好插件的project中,创建Book 域类

       安装指令:Grails create-domain-class Book

       悲哀,这一步就出错了:unable to resolve class org.joda.time.LocalDate

       很明显,没有joda.time插件,安装之:

安装指令:grails install-plugin joda-time

       再运行:Grails create-domain-class Book

       创建成功:Created DomainClass for Book

2)修改Book域类,与示例一致:

    


   class Book { 

       String title

       String author

       int numSold

       static constraints = {

    }

}


3)创建控制器:

安装指令:grails create-controller Book

4)将控制器与Book域类关联

修改控制器文件BookController.groovy如下:

将:


class BookController { 

        def index = { }

}


改为:


class BookController { 

       def scaffold = Book

}


 

5)添加excel处理到应用程序

l         将:grails-app\conf\ BootStrap.groovy文件改成如下:


import YouProjectName.*

 

class BootStrap { 

          def init = { servletContext ->

          String fileName = "c:\\books.xls"

    //String fileName = /.\test-data\books.xls/

           BookExcelImporter importer = new BookExcelImporter(fileName);

    def booksMapList = importer.getBooks();

    println booksMapList

    booksMapList.each { Map bookParams ->

         def newBook = new Book(bookParams)

         if (!newBook.save()) {

                    println "Book not saved, errors = ${newBook.errors}"

         }

    }

    //new Book(importer.getOneMoreBookParams()).save()

 }

    def destroy = {

    }

}


l         BookExcelImporter.groovy 文件放到YourProjectName\src\groovy\TekDays\目录下。BookExcelImporter.groovy文件内容如下:


package YourProjectName

 

import org.grails.plugins.excelimport.ExcelImportUtils

import org.grails.plugins.excelimport.*

import YourProjectName.*

 

class BookExcelImporter extends AbstractExcelImporter {

 

  static Map CONFIG_BOOK_CELL_MAP = [

     sheet:'Sheet2',

     cellMap: [ 'D3':'title',

        'D4':'author',

        'D6':'numSold',

         ]

  ]

 

  static Map CONFIG_BOOK_COLUMN_MAP = [

          sheet:'Sheet1',

                      startRow: 2,

          columnMap:  [

                  'B':'title',

                  'C':'author',

                  'D':'numSold',

          ]

  ]

 

  public BookExcelImporter(fileName) {

    super(fileName)

  }

 

  List<Map> getBooks() {

    List bookList = ExcelImportUtils.convertColumnMapConfigManyRows(workbook, CONFIG_BOOK_COLUMN_MAP)

  }

 

  Map getOneMoreBookParams() {

    Map bookParams = ExcelImportUtils.convertFromCellMapToMapWithValues(workbook, CONFIG_BOOK_CELL_MAP )

  } 

}


6)“以泪洗面”的时刻

       剧协主席总算见省委书记了,让我们在这“以泪洗面”的时刻欢呼吧。

运行指令:grails run-app

怎么?不激动了?出错了?找到如下提示:.FileNotFoundException: c:\books.xls

c盘根目录下建立books.xls,再运行。终于泪流下来了。

在浏览器中输入:http://localhost:8080/YourProjectName/ 进入bookcontroller

等等,里面一片空白,打开books.xls文档,里面也空空如也,先别流泪,回过头去再看前面的解释。

三、理解万岁

1. excel插件用法

Excel插件的核心是包含了一个工具类,里面是一些处理Excel的方法:_org.grails.plugins.excelimport.ExcelImportUtils_

另一个是_AbstractExcelImporter_类,它是用来打开和保存workbook引用,需要被extends

这两上类可以这里找到:C:\Documents and Settings\Administrator\.grails\1.3.5\projects\YourProjectName\plugins\excel-import-0.3\src\groovy\org\grails\plugins\excelimport

2.excel中读取多行数据

       插件是将excel数据按照一定格式输出的,如有下面的excel表格:

grails操作excel - 虹 - 杨柳千丝,绊惹春风
 

       你需要创建一个与表格格式对应的map来接收数据,map中包含指定的sheet,起始行等,并且将列映射到对象属性中,如下:


static Map CONFIG_BOOK_COLUMN_MAP = [
          sheet:'Sheet1', 
                   startRow: 2,
          columnMap:  [
                  'B':'title',
                  'C':'author',
                  'D':'numSold',
          ]
  ] 

再调用:


List bookParamsList = ExcelImportUtils.convertColumnMapConfigManyRows(workbook, CONFIG_BOOK_COLUMN_MAP)


上面的workbookHSSFWorkbook实例,在AbstractExcelImporter定义。这时, bookParamsList得到的就是所有相应列的数据,用assert测试:


assert bookParamsList, [
  [AuthorName:'Shakespeare', BookName:'King Lear', NumSold:1000],
  [AuthorName:'Shakespeare', BookName:'Hamlet', NumSold:10000],
  [AuthorName:'Tolstoy', BookName:'War and Peace', NumSold:200],
] 

       在我们的例子中,使用了一个方法把数据列表传递出去:

 


  List<Map> getBooks() {

    List bookList = ExcelImportUtils.convertColumnMapConfigManyRows(workbook, CONFIG_BOOK_COLUMN_MAP)

  }


 

BootStrap.groovy中,调用了该方法,获取数据列表后,构造Book实例:


……

def booksMapList = importer.getBooks();

booksMapList.each { Map bookParams ->

         def newBook = new Book(bookParams)

         if (!newBook.save()) {

           println "Book not saved, errors = ${newBook.errors}"

         }

        }

…… 


3.excel中读取单元数据

       使用ExcelImportUtils.convertFromCellMapToMapWithValues方法来读取单独的单元数据。


static Map CONFIG_BOOK_CELL_MAP = [ 
     sheet:'Sheet2', 
     cellMap: [ 'D3':'title',
        'D4':'author',
        'D6':'numSold',
        ]
  ]

Map bookParams = ExcelImportUtils.convertFromCellMapToMapWithValues(workbook, CONFIG_BOOK_CELL_MAP )


其中:D3D4之类为excel单元序号

4.excel中读取格式化数据


static Map propertyConfigurationMap = [
          authorName:([expectedType: ExcelImportUtils.PROPERTY_TYPE_STRING, defaultValue:null]),
          numSold:([expectedType: ExcelImportUtils.PROPERTY_TYPE_INT, defaultValue:0]),
          ('bookType'):[expectedType: ExcelImportUtils.PROPERTY_TYPE_STRING, defaultValue:null, valueEquivalentToNull:'Select One'],
   ]

 

  Map siteParams = ExcelImportUtils.convertFromCellMapToMapWithValues(sheet, cellMap, propertyConfigurationMap )


 

配置参数:

expectedType :期望得到的数据类型,包含以下类型:ExcelImportUtils.PROPERTY_TYPE_INT ExcelImportUtils.PROPERTY_TYPE_STRING ExcelImportUtils.PROPERTY_TYPE_DATE

其它类型如浮点型等,无定义

defaultValue:默认值,当读取类型与设置不符时或该单元没有值是,返回该默认值。

valueEquivalentToNull:如果读取失败,则可以“选择一个值”,否则为空(or cells that have drop down, you may have something like "Select A Value", which if not selected is really equivalent to null.)。

四、拓展与遗留问题

       写到这里,读取excel应该没问题了,但如何写入数据到excel呢?如何处理异常数据呢?如上面的疑问,按类型取值时,浮点类型如何取呢?等等,还需要继续,今天暂时到这里。

五、结束

       grails中要用到excel,于是上网找资料,整理记录。本想纯技术性记录,但在整个过程中,诸多问题,苦闷不堪。于是将整个学习过程记录下来,顺便在里面发发牢骚。

       我花了一整天上班时间,完成这些工作,希望能节约你的时间。

~请尊重民工,转载注明出处~


PS:要网上看到一篇比较好的POL操作excel文章,我就没必要再续了。详见:http://www.blogjava.net/zJun/archive/2007/01/22/95385.html

  评论这张
 
阅读(4715)| 评论(4)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018