欢迎您来到 数字平台。 您尚未登录。[登录] [注册新用户]
当前位置: 论坛首页 / 栏目 产品与服务 / 文章 510

点击:16118[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 1 楼
文章id: 510
如何将外来的EXCEL读者数据格式转换为DP2系统读者数据格式(本帖内容已过时)



(注:已有更新的、更方便的解决方案,详见:导入Excel格式读者数据


很多客户在问,能否将EXCEL数据格式转换为DP2系统数据格式,从而实现将外部数据批量导入到DP2系统中。

 

鉴于这些外来的EXCEL数据格式五花八门,没有一个统一的标准,所以在DP2系统中不可能预先提供一个大小通吃,自动转换的相关工具。我们必须对这些不同的EXCEL进行分析,再将电子表格中的数据对应转换为DP2系统数据的对应字段。

事实上,利用DP2系统数据格式采用当前最具开放性与结构化的XML(可扩展标注语言)标准,可以很容易找到EXCEL数据与DP2数据的对应关系。

下面,我将通过模拟学校图书馆从教务处获得一个EXCEL学生名录,并对应转换为DP2读者数据的流程,演示一下数据转换。

 

一、EXCEL文件转换为XML格式

 

office 2003及以上版本中的EXCEL程序打开将电子表格文件(*.xls)——从office 2003开始,office系列开始支持XML格式的文档。如图(为保护隐私,我将学生姓名隐藏):

EXCEL中,通过“另存为”方式,将当前.xls文件另存为“XML 电子表格 2003()”——在另存为对话框中的“保存类型”中选择此项。

另存时,程序会提示是否去掉某些不兼容的功能,选择“是”:

现在,将会产生一个以XML为扩展名的文件,它就是一个采用XML标准的数据格式。我们可用记事本程序打开它查看内容(不要双击它打开,因为双击它,会根据文件头部的处理指令,自动调EXCEL程序来打开,这跟你之前装载.xls文件看到的效果没啥区别),如图:

仔细观察,可以看出这个文件中的Worksheet元素对应于EXCEL中的一个工作表,Table元素对应于其中的一个表格,Row元素对应于表格中的一行,Cell元素对应于这行中的一列(单元格)。

也就是说,我们只需要处理这些重复的RowCell,定位其顺序,即可对应转换成DP2系统读者数据格式中的元素(字段)中。

由于现在的电子表格数据是XML格式的,我们DP2系统读者数据格式也是XML格式的,XML转换成另一个XML,最好的办法是借助XSLT(可扩展样式转换语言)标准。

 

二、编写可扩展样式转换语言

 

可扩展样式转换语言可通过开发工具进行编写,如无开发工具,也可直接利用纯文本编辑器(如微软的notepad.exe)进行编写。

首先,引入相应的名字空间,这些名字空间除了可扩展样式语言采用的外,还有DP2系统读者数据格式采用的"http://dp2003.com/dprms"以及XML电子表格数据采用"urn:schemas-microsoft-com:office:spreadsheet"(不明白微软在XML电子表格中采用同一个名字空间的两个不同前缀的深意,先照搬过来再说):

xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dprms="http://dp2003.com/dprms" xmlns:e="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" exclude-result-prefixes="e ss">

其次,希望输入的结果为UTF-8编码的XML文档(可选):

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

由于电子表格可能具有多个工作表,为了区分这些工作表,我们可以设置一个参数,将其值传递到后面的模板中:

  <xsl:param name="sheetname">读者信息xsl:param>

  <xsl:template match="e:Workbook">

    <xsl:element name="dprms:collection">

      <xsl:apply-templates select="e:Worksheet[@ss:Name=$sheetname]"/>

    xsl:element>

  xsl:template>

开始层层匹配模板(从工作表找到工作表中的表格中的行,再找到行中的各单元格。匹配的同时,输出DP2读者数据的封装元素root):

  <xsl:template match="e:Worksheet">

    <xsl:apply-templates select="e:Table/e:Row"/>

  xsl:template>

  <xsl:template match="ss:Row">

    <xsl:element name="root">

      <xsl:apply-templates select="e:Cell"/>

    xsl:element>

  xsl:template>

  <xsl:template match="ss:Cell">

    <xsl:variable name="curCol">

      <xsl:choose>

        <xsl:when test="@ss:Index">

          <xsl:value-of select="@ss:Index"/>

        xsl:when>

        <xsl:otherwise>

          <xsl:call-template name="cell-index">

            <xsl:with-param name="idx" select="1"/>

          xsl:call-template>

        xsl:otherwise>

      xsl:choose>

    xsl:variable>

    <xsl:choose>

     

      <xsl:when test="$curCol=1">

        <xsl:element name="name">

          <xsl:value-of select="normalize-space(ss:Data)"/>

        xsl:element>

      xsl:when>

      其它匹配元素略-->

    xsl:choose>

  xsl:template>

上面模板中,可以看到设置了一个curCol变量,这是本可扩展样式转换文件的一个重点与要点。由于在XML格式电子表格中,对于空的单元格,并不是完全采用不含数据元素的cell元素表达,为了节省数据尺寸,采用在下一个cell元素中添加ss:Index属性实现跳过空单元格并重新定位新单元格的方式。所以,并不能简单通过position()函数定位不同的Cell,因而,为curCol变量值设计了一个递归调用模板,命名为"cell-index"

  <xsl:template name="cell-index">

    <xsl:param name="idx"/>

    <xsl:if test="$idx <= position()">

      <xsl:choose>

        <xsl:when test="preceding-sibling::ss:Cell[position()=$idx]/@ss:Index">

          <xsl:value-of select="preceding-sibling::ss:Cell[position()=$idx]/@ss:Index +$idx"/>

        xsl:when>

        <xsl:when test="$idx = position()">

          <xsl:value-of select="$idx"/>

        xsl:when>

        <xsl:otherwise>

          <xsl:call-template name="cell-index">

            <xsl:with-param name="idx" select="$idx+1"/>

          xsl:call-template>

        xsl:otherwise>

      xsl:choose>

    xsl:if>

  xsl:template>

至此,可扩展样式文件编辑完成。

 

三、转换XML格式的电子表格数据为DP2系统读者数据格式

 

可以用多种方式实现XML的样式转换,我们采用C#编一个转换程序实现转换后的文件输出:

XML文件输入框中,通过右边的文件浏览按钮,查找到待转换的XML格式的电子表格文件。

XSLT转换文件输入框中,通过右边的文件浏览按钮,查找到刚才编制的可扩展样式转换文件。

在结果输出目录输入框中,通过右边的文件夹浏览按钮,确定结果文件输出目录。

然后,点击样式转换按钮,会在下部的文本框中,显示转换后的结果。并且,在指定的结果输出目录中,会创建出以默认的“output.xml”文件名命名的结果文件

如果需要转换程序及可扩展样式文件,请与我直接联系。



发表时间: 2009-09-12 23:13:35
最后修改时间: 2014-07-31 21:26:19
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 2 楼
文章id: 535
这应该是一个很实用的功能

作者: 忆冰

关键词: 新读者数据输入 制证系统


  今年新生进校,就遇到了这样的问题,好在新生不多,我就一条一条地输入了,但也比较麻烦,有时间要静下心来,细细研究一下如何解决这个问题。

  还有就是制借阅证的问题,一直以为DT1000的制证系统很不错,做出来的证很漂亮,更重要的是实用。当然排除用IC卡或其他的更为先进的制证系统,我认为DT1000的制证系统是目前比较不错的一个制证工具。

  可惜的是,DP2到现在还没有制作读者证的功能,让人多少有些遗憾,也希望丹诚抓紧时间开发一个比较好用的制证系统。

  不知道其他图书馆有没有这样的要求。



发表时间: 2009-09-25 20:55:38
最后修改时间: 2009-09-25 20:57:41



页 1 / 1
 

在线用户
访客访客 (我自己)   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客
当前栏目在线用户数 30, 总在线用户数 31