sheetJS实现把excel导入数据库

1、问题描述

        最近在做报表导入数据库的需求,报表文件为excel里面有多个sheet。

2、解决方法

  • 使用FileReader异步读取上传的文件。
  • 使用sheet.js进行excel表格内容的解析。
  • 使用bootstrap.js的tab组件对上传的表格进行一个页面预览的展示。

3、参考代码

        ImportReportForm.asp

<%Response.Charset="GB2312"%>
<script type="text/javascript" charset="utf-8" src="/root/js/xlsx.full.min.js"></script>
<script src="/root/js/jquery.min.js"></script>
<script src="/root/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="/root/css/bootstrap.min.css">

<script type="text/javascript">
    $(document).ready(function (){
        $("#BtnOK").click(function(){
            var fileInput=$("#uploadfile")
            parseFile(fileInput[0].files[0])
        });

        function parseFile(file){
            console.log(file)
            var rABS = FileReader.prototype.readAsArrayBuffer;
            var filereader=new FileReader()
            filereader.onload=function(){   //回调函数
                var data = this.result;
                console.log(data);
                var workbook=XLSX.read(data, {type: rABS ? 'binary' : 'array',dateNF: "yyyy-mm-dd",cellDates:true,cellStyles:true})
                $("#btn0").text(workbook.SheetNames[0])
				$("#btn1").text(workbook.SheetNames[1])
				$("#btn2").text(workbook.SheetNames[2])

                $("#tab0").html(XLSX.utils.sheet_to_html(workbook.Sheets[workbook.SheetNames[0]]))
				$("#tab1").html(XLSX.utils.sheet_to_html(workbook.Sheets[workbook.SheetNames[1]]))
				$("#tab2").html(XLSX.utils.sheet_to_html(workbook.Sheets[workbook.SheetNames[2]]))

                $("#sheet0").val(JSON.stringify(XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]],{header:1})));
				$("#sheet1").val(JSON.stringify(XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[1]],{header:1})));
				$("#sheet2").val(JSON.stringify(XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[2]],{header:1})));
            }
            if(rABS) {
                filereader.readAsBinaryString(file)
            }else{
                filereader.readAsArrayBuffer(file)
            }
        }

        $("#btnImport").click(function () {
            var i=0;
            for(i=0;i<3;i++){
                var sSheetName=$("#btn"+i).text();
                var json = $.parseJSON("{\"content\":" + $("#sheet"+i).val() + "}");
				var content = json["content"];
                console.log(content)
                importDetail(sSheetName,content)
            }
        });

        function importDetail(sSheetName,sContent){
            var sDetailContent;
            var j=1;
            //row表示excel中每个sheet内容的行数。因为我这里每个sheet的内容有6行,所以这里row设置为6,当然如果你不能确定每个sheet内容会有几行的话,直接设置一个很大的数,比如:60,600也是可以的
            var row=6; 
            while (j<=sContent.length) {
                sDetailContent="";
                for(var k=1;k<=row;k++){
                    if(j>sContent.length){
                        break;
                    }
                    if (sDetailContent==""){
						sDetailContent = sDetailContent + JSON.stringify(sContent[j-1]);
					}
					else{
						sDetailContent = sDetailContent + "," + JSON.stringify(sContent[j-1]);
					}
					j++;
                }
            
                sDetailContent="[" + sDetailContent + "]";
                $.ajax({
                    url:"ImportReport.asp",
                    type:"POST",
                    async: false,
                    data:{
                        SheetName: escape(sSheetName),
                        Content:escape(sDetailContent)
                    },
                    dataType:"text",
                    success:function(data){
            
                    },
                    error: function(data){
                    
                    }
                })
            }
        }

    });

</script>
<div>
    <form id="uploadForm" name="uploadForm"> 
        上传文件:<input type="file" name="uploadfile" id="uploadfile" value="uploadfile" />
    </form>
     <button id="BtnOK" name="BtnOK" class="btn ">确定</button>
     <br/><br/><br/>
     <button type="button" id="btnImport" class="btn" >导入</button>
</div>

<div>
    <ul id="myTab" class="nav nav-tabs">
	<li>
		<a href="#tab0" data-toggle="tab" id="btn0">
			
		</a>
	</li>
	<li>
		<a href="#tab1" data-toggle="tab" id="btn1">
			
		</a>
	</li>
	<li>
		<a href="#tab2" data-toggle="tab" id="btn2">
			
		</a>
	</li>
</ul>
</div>

<div id="myTabContent" class="tab-content">
	<div class="tab-pane fade in active" id="tab0">	
		
	</div>
	<div class="tab-pane fade " id="tab1">
		
	</div>
	<div class="tab-pane fade" id="tab2">
		
	</div>

</div>

<input type="hidden" id="sheet0" name="sheet0" value=""/>
<input type="hidden" id="sheet1" name="sheet1" value=""/>
<input type="hidden" id="sheet2" name="sheet2" value=""/>

ImportReport.asp

<%
Response.Charset="GB2312"
sSheetName = unescape(Request("SheetName"))
sContent = unescape(Request("Content"))
Response.write "sSheetName="&sSheetName&"<br/>"
Response.write "sContent="&sContent&"<br/>"
%>

4、运行结果

        先选择要上传的文件

 

         点击“确定”,FileReader获取上传的文件的内容,sheetjs把FileReader获取到的文件内容渲染到页面上。

 

 

        点击“导入”按钮,使用$.parseJSON把excel每个sheet中的内容转为json数组。把这个转换好的数组传到后端进行处理就行了。

 

 5、总结

        因为只要得到了那个转换好的数组,后端再进行一个数组的解析和入库这个就很简单了,所以我就没写后端的处理代码。因为目前开发的需求许多地方要等用户回复确认,比如那个报表导入模板什么的。之前也研究了一下报表导入功能的实现并且现在正好手头空闲下来了,就忙里偷闲记录一下了。

        感觉原生js直接操作dom确实很麻烦的。

         上框架会方便不少,不过前提是你要熟悉dom。

6、参考资料

FileReader - Web API 接口参考 | MDN (mozilla.org)

 Reading Files | SheetJS Community Edition

js使用xlsx读取excel文件_茯神_fushen的博客-CSDN博客 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用C#来实现Excel数据导入数据库中。下面是一个简单的示例代码,演示了如何使用C#和ADO.NET来完成这个任务: 首先,你需要安装Microsoft.Office.Interop.Excel来处理Excel文件。在Visual Studio中,右键点击项目,选择"Manage NuGet Packages",然后搜索并安装"Microsoft.Office.Interop.Excel"。 接下来,你可以使用以下代码来实现导入功能: ```csharp using System; using System.Data; using System.Data.OleDb; class Program { static void Main(string[] args) { string excelFilePath = "your_excel_file_path.xlsx"; string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFilePath};Extended Properties='Excel 12.0 Xml;HDR=YES;'"; string sql = "SELECT * FROM [Sheet1$]"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); using (OleDbCommand command = new OleDbCommand(sql, connection)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)) { DataSet dataSet = new DataSet(); adapter.Fill(dataSet); DataTable dataTable = dataSet.Tables[0]; // 这里可以遍历dataTable将数据插入到数据库中 foreach (DataRow row in dataTable.Rows) { string column1Value = row["Column1"].ToString(); string column2Value = row["Column2"].ToString(); // 插入数据库的代码 } } } } } } ``` 请注意,你需要将"your_excel_file_path.xlsx"替换为你的Excel文件的路径,并根据实际情况修改查询语句和插入数据库的代码。此示例假设Excel文件的第一个工作表的名称为"Sheet1",你可以根据实际情况进行调整。 希望这个示例能对你有所帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金斗潼关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值