序文
最近、プロジェクトにExcelファイルをアップロードしてインポートし、ファイル内の情報を取得して、ビジネスニーズや一部のデータ処理に応じてデータベースに保存する必要があります。私がそれをどのようにしたかを紹介しましょう。
アイデア
(1)フロントページにファイルアップロードボタンがあります(素敵なボタンが必要な場合は、独自のスタイルを設定するか、layUIのボタンを使用できます)
(2)JSのFormData()オブジェクトを使用して、アップロードするファイルをappend()に追加します入ってください。AJAXを使用してインターフェイスを呼び出し、HttpPostedFileを使用してバックエンドで受信します。これはRequest.Files [0]です。
(3)クライアントによってアップロードされたファイルを取得した後、この場所では、一部のファイルタイプの検証など、ファイルの検証処理を実行できます。イメージファイル、エクセルファイルなど。問題なくローカルファイルにアップロードした後、HttpPostedFileオブジェクトを使用している場合は、彼の保存メソッドSaveAs( "save path")の1つを直接呼び出すことができます
(4)ファイルがアップロードされたら、OleDbオブジェクトを使用して読み取ります。読み取り中に、オンデマンドでデータベースをフェッチして保存できます。
実装
JavaScriptコード
//点击上传Excel事件,我这里使用的是Layui的上传文件按钮,所以事件也是使用的是它的格式。
upload.render({
elem: '#btn_Excel'
, url: '/'
, auto: false
, acceptMime: ".xlsx,.xls"
, before: function (obj) {
}
, type: "file"
, accept: 'file' //普通文件
, choose: function (obj) {
var files = obj.pushFile();
obj.preview(function (index, file, result) {
var formData = new FormData();
//这里这个file就是我们选择好了的文件对象
//将它追加在FormData对象中
formData.append("file", file);
$.ajax({
url: "/后端接口",//填写你自己的后端接口
type: 'POST',
data: formData,
// 告诉jQuery不要去处理发送的数据
processData: false,
// 告诉jQuery不要去设置Content-Type请求头
contentType: false,
beforeSend: function () {
layui.use('layer', function () {
layerloadindex = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
, content: '文件上传中...请稍候...',
success: function (layero) {
layero.find('.layui-layer-content').css({
'padding-top': '39px',
'width': '180px'
});
}
});
});
},
success: function (data) {
if (data == "true") {
//关闭 加载动画
layer.close(layerloadindex);
//给出提示
layer.msg('文件上传成功!!');
} else {
layer.msg(data); }
},
error: function (data) {
layer.close(layerloadindex);
layer.msg(data);
}
});
});
}
, done: function (res) {
}
, error: function () {
}
});
バックエンドコード(ここでは一般的な処理ファイルを使用します)
/// <summary>
/// Excel文件读取
/// </summary>
/// <param name="Postfile"></param>
/// <param name="cDate"></param>
/// <returns></returns>
private string RdIn_upload_keep(HttpPostedFile Postfile, string cDate)
{
//对文件日期进行检查
cDate = dyTools.checkTools.CheckDateFormation(cDate);
if (cDate == "") cDate = DateTime.Now.ToString("yyyy-MM-dd");
//【这里可以执行,上传是否重复可以考虑对数据库进行覆盖即是对表的删除】
//这里是将时间转化成年月模式,比如2020-10-01 处理之后就是2020-10
cDate = cDate.Split('-')[0] +'-'+ cDate.Split('-')[1];
//将存取Excel的虚拟路径映射为物理路径
string cPath = HttpContext.Current.Request.MapPath("/Content/excel");
//获取文件名字
string cFileName = Path.GetFileName(Postfile.FileName);
//获取文件的扩展名
string cFileExt = Path.GetExtension(cFileName);
if (cFileExt != ".xlsx") return "Excel文件不正确";
//生成一个新文件名称
string cNewFileName = Guid.NewGuid().ToString();
cNewFileName = cPath + "\\" + cNewFileName + cFileExt;
Postfile.SaveAs(cNewFileName);
次に、この場所はすでにExcelファイルを保存しているので、必要なのはOLEDBオブジェクト接続を使用して読み取ることだけです。
(1)最初にSystem.Data.OleDbを使用して名前名をインポートします。
インポートが完了したら、次に進むことができます。
上記の方法の直後のコードであることに注意してください。
OleDbConnection dbOle = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + cNewFileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");
try {
dbOle.Open(); }
catch{
return "不能打开EXCEL文件";}
OleDbCommand dbOleCommand = dbOle.CreateCommand();
string cSheet = "Sheet1";
OleDbConnectionデータソース接続オブジェクト(パラメーター内は接続文字列です)この場所は、異なるファイルサフィックス、接続文字列が異なることに注意する必要があります
。例:
Xlsxファイル
(1)構文形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source =アップロードされたファイルアドレス; Extended Properties = "Excel 12.0 Xml; HDR = YES; IMEX = 1";
Xlsbファイル
(2)構文形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source =アップロードされたファイルアドレス; Extended Properties = "Excel 12.0; HDR = YES"; ";
Xlsmファイル
(3)文法形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source = Uploaded file address; Extended Properties = "Excel 12.0 Macro; HDR = YES" ;;
したがって、ここで必要なのはXlsxファイルであり、使用される接続文字列は最初のものです。同時に、Excelをデータベースとして扱うだけでよいため、表を簡単に読み取ることができます。
たとえば、データを読み取ります
OleDbCommand dbOleCommand = dbOle.CreateCommand();
string cSheet = "Sheet1";
dbOleCommand.CommandText = "SELECT * FROM [" + cSheet + "$]";
OleDbDataReader dbOleRec = dbOleCommand.ExecuteReader();
CommandTextプロパティとExecuteReader()オブジェクトを使用して、このように読むだけで、SQLステートメントもほとんど同じです。次に、私の文字列cSheet = "Sheet1"; Sheet1はなぜですか?次に、誰もが自分の状況に応じて決定する必要があります。
ExecuteReaderが出てきたので、誰もが何をすべきか知っていると思います。
if (dbOleRec.HasRows)
{
while (dbOleRec.Read())
{
//就在这个地方读取就好了
}
}
注:読むときは、ExcelでA、B、C、D ... AAの代わりにインデックスを押してください。dbOleRec [0] .ToString()。次に、ビジネスニーズに応じてデータを処理するか、データベースに保存できます。
このステップに来ると、いくつかの問題が発生します。
「Microsoft.ACE.oledb.12.0」がローカルコンピュータに登録されていません
見たことがありますか、仲間、私もこの穴に落ちました、そして私は長い間解決策を探していました。ははは、大丈夫です。彼の解決策をみんなに勧めましょう。私は彼の方法を使って、ついに解決しました。「microsoft.ACE.oledb.12.0ソリューション」がローカルコンピューターに登録されていません
やっと
今日の共有は以上です。ご不明な点がございましたら、もちろん以下にメッセージを残してください。訂正してください。一緒に学び、一緒に進歩する