sql-server - 要求使用 excel 报告中的列数识别报告
问题描述
我有两个 excel 文件,我想将这些文件导入 SQL 临时表。
第一个excel文件:
T1 T2 T3 T4 Total
1,472 1,364 1,422 – 4,258
-152.6 -152.6 -152.6 –
1,958 1,939 1,942 –
-122.6 -123.7 -122.2 –
第二个excel文件:
T1 T2 T3 T4 T5 Total
1,472 1,364 1,422 – 12.2 4,258
-152.6 -152.6 -152.6 – 1000.12
1,958 1,939 1,942 – 50.23
-122.6 -123.7 -122.2 – 185.25
SSIS中是否有任何方法可以根据列数识别文件?我需要根据列号识别报告。
解决方案
如果您需要导入具有不同架构的 excel,您有两种方法:
(1) SSIS方式:Script Task + 2个数据流任务
如果您只有两个结构,则可以按照以下步骤操作:
System.Int32
添加类型示例的变量:@[User::ColumnsCount]
- 添加类型变量
System.String
来存储文件路径示例:@[User::FilePath]
- 添加脚本任务并选择
@[User::FilePath]
为只读变量和@[User::ColumnsCount]
读写变量 在脚本Task里面写一个类似的脚本:
string FilePath = Dts.Variables["User::FilePath"].Value.toString(); string ExcelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; "Data Source='" + FilePath + "';Extended Properties=\"Excel 12.0;HDR=YES;\""; using (OleDbConnection OleDBCon = new OleDbConnection(ExcelConnectionString)) { if (OleDBCon.State != ConnectionState.Open) OleDBCon.Open(); using (OleDbCommand cmd = new OleDbCommand(strcommand, OleDBCon)) { DataTable dtTable = new DataTable("Table1"); cmd.CommandType = CommandType.Text; //replace Sheet1$ with the sheet name if it is different cmd.CommandText = "SELECT * FROM Sheet1$" using (OleDbDataAdapter daGetDataFromSheet = new OleDbDataAdapter(cmd)) { daGetDataFromSheet.FillSchema(dtTable, SchemaType.Source); Dts.Variables["User::ColumnsCount"].Value = dt.Columns.Count; } } }
为每个 Excel 结构添加两个数据流任务
- 将脚本任务链接到这些数据流任务中的每一个
- 单击每个优先约束(任务之间的链接)并将优先类型更改为表达式和约束,并为每种情况添加适当的表达式:
5列:
@[User::ColumnsCount] == 5
6列:
@[User::ColumnsCount] == 6
- 将
Delay Validation
两个数据流任务的属性设置为 True
TL DR: 如果您只有两个结构,您可以添加两个数据流任务(每个结构一个),然后您可以使用脚本任务来识别列数并根据列数执行适当的数据流任务(使用优先约束表达式)。
(2) C#方法:SchemaMapper类库
最近我在 Github 上开始了一个新项目,这是一个使用 C# 开发的类库。您可以使用它使用架构映射方法将表格数据从 excel、word、powerpoint、text、csv、html、json 和 xml 导入到具有不同架构定义的 SQL Server 表中。在以下位置查看:
您可以按照此 Wiki 页面获取分步指南:
推荐阅读
- javascript - 无法从 React 客户端向服务器发送数据
- firebase - nuxt存储模块模式下的firebase身份验证
- javascript - 使用 Javascript 创建表(tableee 添加)
- c# - 使用 c#.net 窗口窗体注册条形码扫描仪并仅从扫描仪接收数据
- sql - SQL Server 查询更新重复记录
- chef-infra - [chef]:查看节点上所有可用的数据包
- ios - UIModalTransitionStylePartialCurl 使我的应用程序崩溃
- python - cli.py __init__.py 等问题的烧瓶会话错误
- java - Spring Data JPA空指针异常
- azure - Azure 门户和 az 命令获取 VM 的可用 SKU 之间的矛盾信息