Import Excel trong Asp.Net

Trong dự án mình tham gia gần đây có một chức năng cần phải lấy dữ liệu từ file excels để đưa vào csdl SQL Sever. Chức năng này khá đơn giản nhưng có vẻ rất hiệu quả trong ứng dụng thực tế nên mình muốn chia sẻ với mọi người...

1. Chuẩn bị.

- Để lập trình import excel trước tiên ta cần chuẩn bị 1 file excel với các colum name theo quy định nào đó (Thường sẽ theo file excel của khách hàng cung cấp hoặc file xuất ra từ 1 phần mềm từ phía khách hàng).

- Ở ví dụ này mình tạo 1 file excel với các column: HoTen, CMND, NgaySinh, GioiTinh, QueQuan, QuocGia, CongTy, ChucVu, BienSoXe

- Định dạng các Cells ở đây mình để là Text hết (Kể cả ngày sinh) vì mình thấy làm cách này khá dễ lập trình xử lý.

2. Thực hiện

- Bước tiếp theo ta tạo mới một website, thư mục Upload sẽ là nơi chứa các file excel được upload lên.

- Ở web.config chúng ta cần thêm một thông tin connect

<appSettings>
    <add key ="FolderPath" value ="/Upload/"/>
  </appSettings>
  <connectionStrings>
    <add name ="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'"/>
    <add name ="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'"/>
  </connectionStrings>

- HTML phía ngoài ở trang Default.aspx chúng ta cần có 1 FileUpload control để chọn file excel và 1 Repeater để hiển thị dữ liệu từ file excel sau khi import

 <table>
      <tr>
        <td>File Excel:</td>
        <td>
          <asp:FileUpload ID="FileUpload1" runat="server" />
        </td>
      </tr>
      <tr>
        <td></td>
        <td>
          <asp:Button ID="btImport" runat="server" Text="Import" OnClick="btImport_Click" />
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <asp:Repeater ID="rpNhanSuFromExcel" runat="server">
            <HeaderTemplate>
              <table>
                <tr>
                  <th>HoTen</th>
                  <th>NgaySinh</th>
                  <th>GioiTinh</th>
                  <th>CMND</th>
                  <th>QueQuan</th>
                  <th>QuocGia</th>
                  <th>CongTy</th>
                  <th>ChucVu</th>
                  <th>BienSo</th>
                </tr>
            </HeaderTemplate>
            <ItemTemplate>
              <tr>
                <td>
                  <%#Eval("HoTen") %>
                </td>
                <td>
                  <%#Eval("NgaySinh") %>
                </td>
                <td>
                  <%#Eval("GioiTinh") %>
                </td>
                <td>
                  <%#Eval("CMND") %>
                </td>
                <td>
                  <%#Eval("QueQuan") %>
                </td>
                <td>
                  <%#Eval("QuocGia") %>
                </td>
                <td>
                  <%#Eval("CongTy") %>
                </td>
                <td>
                  <%#Eval("ChucVu") %>
                </td>
                <td>
                  <%#Eval("BienSo") %>
                </td>
              </tr>
            </ItemTemplate>
            <FooterTemplate>
              </table>
            </FooterTemplate>
          </asp:Repeater>
        </td>
      </tr>
    </table>

- Lưu ý khi bind dữ liệu ra cần lấy đúng tên các cells trong file excel định dạng ban đầu (<%#Eval("HoTen") %>)

- Trong phần code behind trước tiên cần sửa dụng các thư viện sau cho việc thao tác đọc dữ liệu từ file excel được upload ra một DataTable

using System.Data.OleDb;
using System.IO;
using System.Configuration;
using System.Data; 

- Tiếp theo là phần xử lý upload file excel lựa chọn. Vì hiện tại chức năng đọc dữ liệu từ nguồn excel nên cần xác định đúng đuôi mở rộng của file lựa chọn là *.xls hay *.xlsx mới cho upload

protected void btImport_Click(object sender, EventArgs e)
    {
      try
      {
        if (FileUpload1.HasFile)
        {
          string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
          string Extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
          string FolderPath = ConfigurationManager.AppSettings["FolderPath"];
          if ((Extension == ".xls") || (Extension == ".xlsx"))
          {
            string FilePath = Server.MapPath(FolderPath + FileName);
            FileUpload1.SaveAs(FilePath);
            
            Import_To_Grid(FilePath, Extension, "Yes");
          }
          else
          {
            Response.Write("Chỉ cho phép import dữ liệu từ file Excel (*.xls, *.xlsx)");
          }
        }
        else
        {
          Response.Write("Bạn chưa lựa chọn file excel!");
        }
      }
      catch (Exception ms)
      {
        Response.Write(ms.Message);
      }
    }

- Sau khi file excel upload thành công lên hệ thống, bước tiếp theo cần đọc dữ liệu  từ excel và hiện thị ra list ở phần HTML đã thiết kế ở trên bằng cách gọi hàm Import_To_Grid

private void Import_To_Grid(string FilePath, string Extension, string isHDR)
    {

      string conStr = "";
      switch (Extension)
      {
        case ".xls": //Excel 97-03
          conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
          break;
        case ".xlsx": //Excel 07
          conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
          break;
      }
      conStr = String.Format(conStr, FilePath, isHDR);
      OleDbConnection connExcel = new OleDbConnection(conStr);
      OleDbCommand cmdExcel = new OleDbCommand();
      OleDbDataAdapter oda = new OleDbDataAdapter();
      DataTable dt = new DataTable();
      cmdExcel.Connection = connExcel;

      //Get the name of First Sheet
      connExcel.Open();
      DataTable dtExcelSchema;
      dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
      string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
      connExcel.Close();

      //Read Data from First Sheet
      connExcel.Open();
      cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
      oda.SelectCommand = cmdExcel;
      oda.Fill(dt);
      connExcel.Close();

      //Bind Data
      if (dt.Rows.Count != 0)
      {
        rpNhanSuFromExcel.DataSource = dt;
        rpNhanSuFromExcel.DataBind();
      }
      else
      {
        rpNhanSuFromExcel.DataSource = null;
        rpNhanSuFromExcel.DataBind();
      }
    }

- Trong giới hạn bài này mình chỉ làm ví dụ về việc lấy dữ liệu từ file Excel có sẵn và đẩy vào DataTable thôi, sau đó hiện thị ra list ở phía ngoài từ DataTable này. Bạn nào cần chuyển dữ liệu sau khi import sang SQL thì sửa lại theo nhu cầu.

3. Kết luận.

- Ở ví dụ này mình mới chỉ làm thử với file excel có ít dữ liệu nên chưa đánh giá được tốc độ xử lý.

- Khi triển khai lên Sever 64 bit, có thể các bạn sẽ gặp lỗi "The Microsoft.Jet.OLEDB.4.0 provider is not registered..." và cách xử lý như sau. 

* Enable 32 bit Applications = True trong Application Pool ứng dụng web của bạn

* Download và cài đặt thêm AccessDatabaseEngine tại link sau:

http://www.microsoft.com/en-us/download/confirmation.aspx?id=23734

- Các bạn có thể download ví dụ đầy đủ ở file đính kèm cuối bài viết

Download Source

Related Post


Sử dụng Asp.net Chart Control để vẽ biểu đồ trên website
Tuesday, October 28, 2014
Sau mấy tuần bận rộn với một đống công việc phải giải quyết, hôm nay được một ngày rảnh rỗi. Lại ngồi viết một bài cho phong phú website của mình, sau nữa là có chỗ để lúc nào cần xem lại copy code cho nhanh (^.^). Ở bài này mình làm một ví dụ về sử dụng Asp.net Chart Control để vẽ biểu đồ trên web, với số liệu thống kê được lấy từ CSDL SQL.
Tài liệu Video học Asp.net MVC 4.0 Tiếng Việt
Wednesday, September 10, 2014
Hôm nay lang thang trên mạng tìm được một bộ video về Asp.Net MVC4 khá hay và đầy đủ. Thực sự thấy biết ơn tác giả bộ video này đã bỏ thời gian chia sẻ kiến thức đến mọi người...
Search

Đăng ký nhận bài mới


Category

Blog Archive