备份的数据不知道如何判断时间段,让我们的管理员把表中的数据全部下载了下来,每一个都要有10M大小,没办法处理了,又陷入了僵局。这么多的xml文件如何处理,用Excel表打开一看,可以看到表的字段,另存为excel表,同时把表中的字段项删除后,文件内容变成了标准的数据表格式。同时文件大小也变成了1.4M,每个数据表中的记录为3000条,在CKIS数据表中大约有记录3000000条,利用熟悉的excel表处理是不太现实了。最终制定了如下的处理流程:
前面的利用Excel表中的VBA实现,这样可以把文件执行速度比较快。
VBA数据整理代码,把xml另存为xlsx
下面展示一些 内联代码片
。
Application.ScreenUpdating = True
objFileName = Range("B" & iRow).Value
Range("C" & iRow).Value = Left(objFileName, Len(objFileName) - 4) & ".xlsx"
Range("D" & iRow).Value = "正在转换"
DoEvents
Application.ScreenUpdating = False
If UCase(Right(objFileName, Len(XML))) = UCase(XML) Then
NewFileName = convFolder & Range("C" & iRow).Value
Set ConvertThis = Workbooks.OpenXML(Filename:=xmlFolder & "\" & objFileName, LoadOption:=xlXmlLoadImportToList)
ConvertThis.SaveAs Filename:=NewFileName, FileFormat:=xlOpenXMLWorkbook
ConvertThis.Close
End If
Application.ScreenUpdating = True
Range("D" & iRow).Value = "转换成功"
Range("E" & iRow).Value = "共耗时" & Format(Timer - t, "00.00") & "秒"
Application.ScreenUpdating = False
VBA数据整理代码,删除xlsx中没用的数据列
下面展示一些 内联代码片
。
NewFileName = convFolder & Range("C" & iRow).Value
Set convertthis = Workbooks.OpenXML(Filename:=xmlFolder & "\" & objFileName, LoadOption:=xlXmlLoadImportToList)
For Each sht In convertthis.Sheets
Select Case FileTitle
Case "CKMLPRKEPH"
sht.Columns("A:J").Delete Shift:=xlToLeft
sht.Rows("2:133").Delete Shift:=xlUpt
Case "CKMLPRKEKO"
sht.Columns("A:J").Delete Shift:=xlToLeft
sht.Rows("2:13").Delete Shift:=xlUpt
End Select
Next
convertthis.Save
convertthis.Close
C#把目录下的xlsx导入到SQL Server中
在SQL Server2012中建立和导出数据格式一致的数据表,运行程序其中读取Excel数据使用的是ADO方式,复制到SQL Server的数据传送代码为SqlBulkCopy模式。
string connectionString = @"Data Source=localhost;Initial Catalog=SRCost;Integrated Security=True";
OleDbConnection ole = null;
OleDbDataAdapter da = null;
DataTable dt = null;
string strTable = textBox1.Text.Trim();
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;"
+ "Data Source=" + strFilePath.Trim() + ";"
+ "Extended Properties=Excel 12.0";
//string sTableName = combox1.Text.Trim();
string strExcel = "select * from ["+ strTable +"$]";
try
{
ole = new OleDbConnection(strConn);
ole.Open();
da = new OleDbDataAdapter(strExcel, ole);
dt = new DataTable();
da.Fill(dt);
using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
{
//bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
//bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 1000;//每次传输的行数
// bcp.NotifyAfter = 1000;//进度提示的行数
bcp.DestinationTableName = this.txtTableName.Text.Trim();//目标表
bcp.WriteToServer(dt);
//MessageBox.Show("导入完成!");
richTextBox1.Text = richTextBox1.Text+strFilePath.Trim() + "完成! ";
label3.Text = strFilePath.Trim() + "导入完成!\n";
}
//为datagridview设置数据源
// this.xlsExpData.DataSource = dt;
//设置每一列显示数据模式为AllCells
//for (int i = 0; i < dt.Columns.Count; i++)
//{
// xlsExpData.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
//}
ole.Close();
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
}
finally
{
if (ole != null)
ole.Close();
}
在SQL Server还原数据表中之间的关系,把数据在最终的视图中展现。