zoukankan      html  css  js  c++  java
  • .net 导入Excel

    今天我在做导入Excel的时候遇到了一些问题,顺便说句其实我很少做这方面的!我的需求是导入EXCEL 验证数据正确性 并把数据显示到页面 如有错误信息则弹出来

    那具体问题是什么呢?

    导入Excel有2种方式 各有千秋 根据自己需要决定

    第一种:直接就是页面后台写代码,很容易实现。 缺点是:页面要刷新并且弹出框只能用系统自带的 所有我采取了第二种方式

    页面代码:

    <form id="formData" enctype="multipart/form-data" method="post" name="files[]" action="/Handler/TestHandler.ashx" target="hidden_frame">

    <asp:FileUpload ID="fileSelect" runat="server" />
    <asp:Button ID="btnRead" runat="server" Text="导入EXCEL" OnClick="btnRead_Click" />

    </div>
    <div id="ListInfo" runat="server"></div>

    </from>

    后台代码:

    ///<summary>
    ///上传文件到临时目录中
    ///</ummary>
    private void Upload()
    {
    HttpPostedFile file = this.fileSelect.PostedFile;
    string fileName = file.FileName;
    string tempPath = System.IO.Path.GetTempPath(); //获取系统临时文件路径
    fileName = System.IO.Path.GetFileName(fileName); //获取文件名(不带路径)
    this.currFileExtension = System.IO.Path.GetExtension(fileName); //获取文件的扩展名
    if (this.currFileExtension.ToLower() == ".xls" || this.currFileExtension.ToLower() == ".xlsx")
    {
    this.currFilePath = tempPath + fileName; //获取上传后的文件路径 记录到前面声明的全局变量
    file.SaveAs(this.currFilePath); //上传
    }
    else
    {
    throw new Exception("你选择的文件格式不正确,只能导入EXCEL文件!");
    }

    }

    ///<summary>
    ///读取xlsxlsx格式的Excel文件的方法
    ///</ummary>
    ///<param name="path">待读取Excel的全路径</param>
    ///<returns></returns>
    private DataTable ReadExcelToTable(string path, string FileExtension)
    {
    string connstring = String.Empty;
    //连接字符串
    if (FileExtension == ".xlsx")
    {
    connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // Office 07及以上版本 不能出现多余的空格 而且分号注意

    }
    else
    {
    connstring = " Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"; //Office 07以下版本
    }

    using (OleDbConnection conn = new OleDbConnection(connstring))
    {
    conn.Open();
    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字
    string firstSheetName = sheetsName.Rows[0][2].ToString(); //得到第一个sheet的名字
    string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查询字符串
    OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);
    DataSet set = new DataSet();
    ada.Fill(set);
    return set.Tables[0];

    }
    }

    /// <summary>
    /// 按钮单击事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnRead_Click(object sender, EventArgs e)
    {

    Upload(); //上传文件方法
    if (this.currFileExtension == ".xlsx" || this.currFileExtension == ".xls")
    {
    DataTable dt = ReadExcelToTable(currFilePath, this.currFileExtension); //读取Excel文件(.xls和.xlsx格式)

    string list = "<table>";
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    list += "<tr>";

    for (int j = 0; j < dt.Columns.Count; j++)
    {

    var aa = dt.Rows[i][j];
    var bb = dt.Rows[i][0];

    list += "<td>" + dt.Rows[i][j] + "</td>";

    }
    list += "</tr>";
    }

    ListInfo.InnerHtml = list + "</table>";

    }

    }

    第二种:是走一般处理程序 这样系统的权限也好控制一些

    我这做这种方法的时候 我学到了另外一个知识点 就是表单提交不刷新页面

    js代码:

    $(function() {
    $("#formData").submit(function () {
    return false;//禁止表单提交
    });
    $("form input[type='submit']").click(function () {

    var url = $('form').attr('action'); // 取Form中要提交的链接
    var param = {}; // 组装发送参数
    param['type'] = $('form input[name=type]').val();
    $.post("/Handler/TestHandler.ashx", param, function (dom) {
    $('div').html(dom);
    });
    })

    });

    这种方法虽然可以不刷新页面 但是要上传文件的话 这种方式是不可行的 

    接下来就说点干货。以下这种方式是利用iframe完成的 其原理是表单提交 页面不刷新 其实刷新的是iframe  注意标红部分

    页面代码:

    <form id="formData" enctype="multipart/form-data" method="post" name="files[]" action="/Handler/TestHandler.ashx" target="hidden_frame">

    <input type="file" name="fileUp" id="fileUp"/>
    <input type="submit" id="btnConfirm" value="导入Excel"/>
    <input type="hidden" name="type" id="type" value="108" />//一般处理程序接受的参数

    <iframe name='hidden_frame' id="hidden_frame"style='display:none' src="TestExcel.aspx"></iframe>
    </form>
    <div class="get" id="get">

    </div>

    后台代码:

    //声明变量(属性)
    string currFilePath = string.Empty; //待读取文件的全路径
    string currFileExtension = string.Empty; //文件的扩展名

    ReadExcelToTable 方法和上面一样

    //上传文件

    private void Upload(HttpContext context)
    {
    HttpPostedFile file = context.Request.Files["fileUp"];
    string fileName = file.FileName;
    string tempPath = System.IO.Path.GetTempPath(); //获取系统临时文件路径
    fileName = System.IO.Path.GetFileName(fileName); //获取文件名(不带路径)
    this.currFileExtension = Path.GetExtension(fileName); //获取文件的扩展名
    if (this.currFileExtension.ToLower() == ".xls" || this.currFileExtension.ToLower() == ".xlsx")
    {
    this.currFilePath = tempPath + fileName; //获取上传后的文件路径 记录到前面声明的全局变量
    file.SaveAs(this.currFilePath); //上传
    }
    else
    {
    throw new Exception("你选择的文件格式不正确,只能导入EXCEL文件!");
    }

    }

    private ResultMessage ShowAlert(HttpContext context)
    {
    try
    {
    Upload(context); //上传文件方法
    if (this.currFileExtension == ".xlsx" || this.currFileExtension == ".xls")
    {
    System.Data.DataTable dt = ReadExcelToTable(currFilePath, this.currFileExtension); //读取Excel文件(.xls和.xlsx格式)
    string list = "<table>";
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    list += "<tr>";

    for (int j = 0; j < dt.Columns.Count; j++)
    {

    var aa = dt.Rows[i][j];
    var bb = dt.Rows[i][0];
    if (i != 0)
    {

    list += "<td>" + dt.Rows[i][j] + "</td>";

    }
    list += "</tr>";
    }

    var ListInfo = list + "</table>";

    //你可以在上面代码中修改成自己的需求

    //上面说到我不想用系统自带的弹窗 那么我们的数据以及错误信息如何展示到页面上呢? 请看以下代码:

    if (arr.Count != 0)//错误提示的集合
    {

    string str = string.Join(",", arr);
    context.Response.Write("<script>var msg=parent.document.getElementById('get');msg.innerHTML='<font color=red>" + ListInfo+ "</font>'; parent.aa('" + str + "');</script>");//只有parent.aa()才能调用到你在页面上的方法 这个方法我是用来弹出错误提示的
    return new ResultMessage(false,ListInfo ,1,arr);
    }
    return new ResultMessage(false);
    }
    return new ResultMessage(false);
    }
    catch (Exception ex)
    {

    return new ResultMessage(false);
    }
    }

    大功告成!小女子不才第一次写博客!代码不周到之处,请指教!其实上面的的代码 我都是从网上看的 改成了自己需要的,以便往后之需!

  • 相关阅读:
    WUSTOJ 1279: Wallace and His Pet(Java)
    WUSTOJ 1235: 计算矩阵的鞍点(Java)
    WUSTOJ 1277: 小吉吉读书(Java)
    WUSTOJ 1276: 峰峰不搞G(Java)
    WUSTOJ 1275: 男神的逆袭(Java)
    WUSTOJ 1274: 喂,这里是帅帅的LCM(Java)
    1269: 划分数(Java)
    1267: 展开字符串(Java)
    1266: gcd和lcm(Java)
    微型计算机接口技术与汇编语言课后答案
  • 原文地址:https://www.cnblogs.com/yanlinyushan/p/4838126.html
Copyright © 2011-2022 走看看