[研究][ASP.NET]使用 ExcelDataReader 3.6.0 讀取匯入 .xlsx 到資料庫
2021-02-08
環境:Visual Studio 2019 + ASP.NET + WebForm + C# + NuGet 安裝 ExcelDataReader 3.6.0
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ImportXlsxByExcelDataReaderTest.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Button ID="Button_Import_Xlsx_by_ExcelDataReader" runat="server" Text="匯入(.xlsx)"
OnClick="Button_Import_Xlsx_by_ExcelDataReader_Click" /><br />
<br />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:TestDBConnectionString %>"
SelectCommand="SELECT * FROM [Table1]" ></asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" />
<asp:BoundField DataField="FieldText" HeaderText="FieldText" SortExpression="FieldText" />
<asp:BoundField DataField="FieldDateTime" HeaderText="FieldDateTime" SortExpression="FieldDateTime" />
<asp:BoundField DataField="FieldInt" HeaderText="FieldInt" SortExpression="FieldInt" />
<asp:CheckBoxField DataField="FieldBit" HeaderText="FieldBit" SortExpression="FieldBit" />
</Columns>
</asp:GridView>
<asp:Label ID="Label_ExportImportMSG" runat="server"></asp:Label><br />
<asp:Label ID="Label_MSG1" runat="server"></asp:Label>
</div>
</form>
</body>
</html> |
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;
using ExcelDataReader;
namespace ImportXlsxByExcelDataReaderTest
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button_Import_Xlsx_by_ExcelDataReader_Click(object sender, EventArgs e)
{
// https://exceldatareader.codeplex.com/
// https://github.com/ExcelDataReader/ExcelDataReader
// https://ithelp.ithome.com.tw/articles/10048933
Label_MSG1.Text = "";
Label_ExportImportMSG.Text = "";
//
string queryString = "";
string errMsg = "";
string url = "";
string msg = "";
string fieldText = "";
string fieldDateTime = "";
DateTime fieldDateTime2 = DateTime.Now;
string fieldInt = "";
string fieldBit = "";
int rowCount = 0;
int columnCount = 0;
int successCount = 0;
int i = 1;
if (!FileUpload1.HasFile)
{
Label_ExportImportMSG.Text = "<font color=red>請選擇.xlsx檔案</font>";
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message",
"<script language='javascript' defer>alert('請選擇.xlsx檔案。');</script>");
return;
}
else
{
string fd = (string)ConfigurationManager.AppSettings["TempFolder"] + "\\";
if (!System.IO.Directory.Exists(fd))
{
System.IO.Directory.CreateDirectory(fd);
}
string ext = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
// ClosedXML 0.94.2 不支援 .csv
// Extension 'csv' is not supported. Supported extensions are '.xlsx', '.xslm', '.xltx' and '.xltm'.
//if (!((ext == ".xlsx") || (ext == ".csv")))
if (!(ext == ".xlsx"))
{
Label_ExportImportMSG.Text = "<font color=red>請上傳副檔名.xlsx檔案</font>";
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('"
+ "請上傳副檔名.xlsx檔案!" + "');</script>");
return;
}
string fileName = fd + FileUpload1.FileName;
FileUpload1.SaveAs(fileName);
string mainFileName = Path.GetFileNameWithoutExtension(FileUpload1.FileName);
//string openFilename = "D:\\WWW\\TempImageFiles\\" + mainFileName + "-匯入結果.xlsx";
string openFilename = fd + mainFileName + "-匯入結果" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".xlsx";
FileUpload1.SaveAs(openFilename);
using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
// Auto-detect format, supports:
// - Binary Excel files (2.0-2003 format; *.xls)
// - OpenXml Excel files (2007 format; *.xlsx)
//using (IExcelDataReader reader = ExcelReaderFactory.CreateCsvReader(stream)) // 支援 .csv,下面還有地方要改
//using (IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(stream)) // 僅支援 .xlsx,不支援 .xls
//queryString = @"DELETE FROM [dbo].[Table1] WHERE id=@id; ";
queryString = @"DELETE FROM [dbo].[Table1]; ";
using (SqlConnection connection = new SqlConnection(
WebConfigurationManager.ConnectionStrings["TestDBConnectionString"].ConnectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
command.ExecuteNonQuery();
}
try
{
using (var reader = ExcelReaderFactory.CreateReader(stream)) // 僅支援 .xls 和 .xlsx,不支援 .csv
{
rowCount = reader.RowCount;
columnCount = reader.FieldCount;
do
{
// 逐列讀取
while (reader.Read())
{
if (i == 1)
{
// 標題不管
}
else
{
// reader.GetDouble(0);
// 會包含第一列 (可能是標題,而非資料)
// 或設定 excelReader.IsFirstRowAsColumnNames = true; 去避免
fieldText = "";
fieldDateTime = "";
fieldInt = "";
fieldBit = "";
// reader[0] 可能是 null
if (reader[0] == null)
{
// 第一欄位必填,null 或 "" 就假設後面都沒有資料
errMsg = "#1匯入.xlsx共" + rowCount + "橫列" + columnCount
+ "行(欄位) (含標題列,若看不到那麼多橫列,可能填寫了不可見字元),第"
+ (i - 1) + "筆 (Excel 第" + i.ToString() + "列) 必填沒有資料,匯入中斷,若資料已經全部匯入,可不用理會訊息。\\n";
//ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('" + errMsg + "');</script>");
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('"
+ errMsg + "');</script>");
return;
}
else
{
fieldText = reader[0].ToString();
if (reader[1] != null)
{
fieldDateTime = reader[1].ToString();
DateTime.TryParse(fieldDateTime, out fieldDateTime2);
}
if (reader[2] != null)
fieldInt = reader[2].ToString();
if (reader[3] != null)
fieldBit = reader[3].ToString();
// --------------------------------------------------------------------------------
// e.Values 中欄位名稱的大小寫要符合前端 Bind 的欄位名稱
// 檢察欄位長度、必填、關聯要求
// errMsg = CheckRecord(fieldText,fieldDateTime,fieldInt,fieldBit);
// if (errMsg != "")
// {
// Page.ClientScript.RegisterStartupScript(Page.GetType(), "message",
// "<script language='javascript' defer>alert('第" + lineNo +
// "筆匯入失敗,匯入中斷!" + errMsg + "');</script>");
// return;
// }
// --------------------------------------------------------------------------------
queryString = @"
INSERT INTO [dbo].[Table1]
([FieldText]
,[FieldDateTime]
,[FieldInt]
,[FieldBit])
VALUES
(N'" + fieldText + "'" +
",'" + fieldDateTime2.ToString("yyyy/MM/dd HH:mm:ss.fff") + "'" +
",'" + fieldInt + "'" +
",'" + fieldBit + "'); ";
using (SqlConnection connection = new SqlConnection(
WebConfigurationManager.ConnectionStrings["TestDBConnectionString"].ConnectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
//command.Parameters.Clear();
//command.Parameters.AddWithValue("@Value", value);
connection.Open();
command.ExecuteNonQuery();
successCount++;
}
}
} // if
i++;
} // while (reader.Read())
} while (reader.NextResult());
//string url = "/List.aspx?Ref1=" + Request.QueryString["Ref1"].ToString() + "&Ref2=" +
// Request.QueryString["Ref2"].ToString() + "&Ref3=" + Request.QueryString["Ref3"].ToString();
url = "#";
msg = "#2匯入.xlsx共" + rowCount + "橫列" + columnCount +
"行(欄位) (含標題列,若看不到那麼多橫列,可能填寫了不可見字元),成功匯入" + successCount + "筆。\\n";
ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('"
+ msg + "');location.href='" + url + "';</script>");
}
}
catch (Exception ex)
{
string exceptionMsg = "不明錯誤。";
if (ex != null)
{
exceptionMsg = ex.Message.ToString();
}
Label_MSG1.ForeColor = System.Drawing.Color.Red;
Label_MSG1.Text = errMsg + "<br />" + exceptionMsg;
errMsg = "#3匯入.xlsx共" + rowCount + "橫列" + columnCount
+ "行(欄位) (含標題列,若看不到那麼多橫列,可能填寫了不可見字元),第"
+ (i - 1) + "筆 (Excel 第" + i.ToString() + "列)匯入失敗。\\n";
//ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('" + errMsg + "');</script>");
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('"
+ errMsg + "');</script>");
// 會因為 Exception 內容關係,JavaScript alert 對話盒視窗可能不會跳出顯示
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('"
+ exceptionMsg + "');</script>");
}
} //using (FileStream fs = File.Open(openFilename, FileMode.Open))
} //if (FileUpload1.HasFile)
GridView1.DataBind(); // 更新畫面
}
}
} |
(完)

沒有留言:
張貼留言