zoukankan      html  css  js  c++  java
  • Aspose实现读取/ 写入Excel初探及相关问题的提出

    数据库和Excel数据交互在生产生活中是很普遍的,实现方式也各异。最近在项目中使用了.NET Excel组件,在本机上运行并没有出现什么情况。而且该组件使用起来也比较简单,功能也很强大。但是将站点发布到服务器上,总是报错。在网上查阅相关资料后,按照步骤哦对服务器进行了配置,结果仍然存在问题。以下是报错信息:

     

    “/”应用程序中的服务器错误。


    检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。

    由于赶时间,只好想办法改写程序。

    之前听说过Aspose组件的强大,他是一款第三方组件,好像也想收费。还好,师兄那里有现成的。以前只是用过该组件从数据库读取数据填充到Excel的功能。其他功能均未使用过。于是就想尝试一下,从Excel读取数据写入到数据库。查了些资料,没找到比较完整的。于是自己做了一个马马虎虎还是能够实现这个功能,但是还在存在一些问题。自己写出来,也希望和大家交流一下,同时也希望大家给点参考。

     首先,还是要设计一个Excel模板的,我的模板名为test.xls.

    以下是后台代码。

    View Code
      1 using System;
    2 using System.Collections;
    3 using System.Configuration;
    4 using System.Data;
    5 using System.Linq;
    6 using System.Web;
    7 using System.Web.Security;
    8 using System.Web.UI;
    9 using System.Web.UI.HtmlControls;
    10 using System.Web.UI.WebControls;
    11 using System.Web.UI.WebControls.WebParts;
    12 using System.Xml.Linq;
    13 using Aspose.Cells;
    14 using System.Data.SqlClient;
    15
    16
    17 namespace PoseExcelToSql
    18 {
    19 /// <summary>
    20 /// 应用第三方组件实现ExcelToSql
    21 /// Author:LuckyHu
    22 /// DateTime:2012-01-01 20:38
    23 /// </summary>
    24 public partial class _Default : System.Web.UI.Page
    25 {
    26 string connStr = "Data Source=.;Initial Catalog=StuInFo;Integrated Security=True";
    27 SqlConnection conn = null;
    28 protected void Page_Load(object sender, EventArgs e)
    29 {
    30 Cells cells;
    31 Workbook workbook = new Workbook();
    32 workbook.Open("C:\\test.xls");
    33 cells = workbook.Worksheets[0].Cells;//暂时只针对第一张表
    34 int result = 0;
    35 int res = 0;
    36 for (int i = 0; i < cells.MaxDataRow + 1; i++)
    37 {
    38 for (int j = 0; j < cells.MaxDataColumn + 1; j++)
    39 {
    40 //string s = cells[i, j].StringValue.Trim();
    41 //string s = cells[]
    42 //一行行的读取数据,插入数据库的代码也可以在这里写
    43
    44 string sno = cells[i, j].StringValue.Trim();//学号
    45 string name = cells[i, j + 1].StringValue.Trim();//姓名
    46 string sex = cells[i, j + 2].StringValue.Trim();//性别
    47 string dept = cells[i, j + 3].StringValue.Trim();//系别
    48 string age = cells[i, j + 4].StringValue.Trim();//年龄
    49 if (name != "姓名" && age != "年龄" && sex != "性别" && dept != "系别" && sno != "学号" && name != "" && age != "" && sex != "" && dept != "" && sno != "")//消除表头
    50 {
    51 //DataSet ds = new DataSet();
    52 //插入数据库操作在这里写
    53 //Response.Write("Hello!");
    54 try
    55 {
    56 conn = new SqlConnection(connStr);
    57 if (conn.State == ConnectionState.Closed)
    58 {
    59 conn.Open();
    60 }
    61 // 插入之前判断数据库中是否存在本条记录
    62 string ExistSql = "select COUNT(1) from student where SNO = '" + sno + "'";
    63 bool bs = Exist(ExistSql, conn);
    64 if (bs == false)//不存在才插入
    65 {
    66 string insertSql = "insert into student values('" + sno + "','" + name + "','" + sex + "','" + dept + "','" + age + "')";
    67 SqlCommand cmd = new SqlCommand(insertSql, conn);
    68 result = cmd.ExecuteNonQuery();
    69 if (result > 0)
    70 {
    71 res += result;
    72 }
    73 }
    74 }
    75 catch (SqlException ex)
    76 {
    77 Response.Write("<script>alert('" + ex.ToString() + "')</script>");
    78 }
    79 finally
    80 {
    81 if (conn.State == ConnectionState.Open)
    82 {
    83 conn.Close();
    84 }
    85 }
    86 }
    87 }
    88 }
    89 Response.Write("<script>alert('" + res.ToString() + "')</script>");//输出录入结果
    90 }
    91
    92 public bool Exist(string ExistSql, SqlConnection conn)
    93 {
    94 bool bs = false;
    95 if (conn.State == ConnectionState.Closed)
    96 {
    97 conn.Open();
    98 }
    99 try
    100 {
    101 SqlCommand cmd = new SqlCommand(ExistSql, conn);
    102 int res = int.Parse(cmd.ExecuteScalar().ToString());
    103 if (res != 0)
    104 {
    105 bs = true;
    106 }
    107 }
    108 catch (SqlException ex)
    109 {
    110 Response.Write("<script>alert('" + ex.ToString() + "')</script>");//输出录入结果
    111 }
    112 return bs;
    113 }
    114 }
    115 }

    自己同时借此机会,提出自己的疑惑,

    使用以下代码

                        string sno = cells[i, j].StringValue.Trim();//学号
    string name = cells[i, j + 1].StringValue.Trim();//姓名
    string sex = cells[i, j + 2].StringValue.Trim();//性别
    string dept = cells[i, j + 3].StringValue.Trim();//系别
    string age = cells[i, j + 4].StringValue.Trim();//年龄

    此种方式时遍历Excel表的时候,总会出现乱序的情况,

    如下,也就是说,字段名和实际值并没有对应。这个是插入到数据库表的情况

    暂时想了个办法,加了个条件

                        if (name != "姓名" && age != "年龄" && sex != "性别" && dept != "系别" && sno != "学号" && name != "" && age != "" && sex != "" && dept != "" && sno != "")//消除表头

    加了过滤条件后,插入正常,

    显然,我不是很满意,这样就会要求Excel中这几个字段每一个都不能空。这显然会存在问题。

    请高手们指点一下!先谢过大家了!

    源码下载:PoseExcelToSql.rar 

  • 相关阅读:
    discuz X3.2 自定义系统广告详解
    windows平台myeclipse+PDT+apache+xdebug调试php
    南浮的IT民工
    linux实践——编译安装两个apache
    如何使maven+jetty运行时不锁定js和css[转]
    linux实践——ubuntu搭建 svn 服务
    测试代码插件(插入代码块)
    FTP 文件接口按天批处理脚本实例
    7月份工作小结
    报表开发过程
  • 原文地址:https://www.cnblogs.com/lucky_hu/p/2319047.html
Copyright © 2011-2022 走看看