C# 脚本任务无法处理工作表名称中的空格
嗨,我有一个脚本任务,从文件夹中提取excel文件。这些文件有几张纸,上面写着“问题1”、“问题2”……等等 我的问题是,它没有阅读或访问上述表格,在问题和1之间有“空格” 但当我将其替换为(_)时,即问题1、问题2…将被检索到..我的脚本任务代码如下..有任何建议我应该在代码中更改什么以选择sheetname作为原始名称C# 脚本任务无法处理工作表名称中的空格,c#,ssis,script-task,C#,Ssis,Script Task,嗨,我有一个脚本任务,从文件夹中提取excel文件。这些文件有几张纸,上面写着“问题1”、“问题2”……等等 我的问题是,它没有阅读或访问上述表格,在问题和1之间有“空格” 但当我将其替换为(_)时,即问题1、问题2…将被检索到..我的脚本任务代码如下..有任何建议我应该在代码中更改什么以选择sheetname作为原始名称 using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Wi
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Linq;
using System.Data.OleDb;
using System.Data.SqlClient;
//using System.Text.RegularExpressions;
namespace ST_0762ccf78a5c4709b806530e3c885949
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
// public static string RemoveSpecialCharacters(string str) { return str.Replace("[^A-Za-z0-9_\\\\.]")};
public void Main()
{
String FolderPath = Dts.Variables["User::FolderPath"].Value.ToString();
string StartingColumn = Dts.Variables["User::StartingColumn"].Value.ToString();
string EndingColumn = Dts.Variables["User::EndingColumn"].Value.ToString();
string StartReadingFromRow = Dts.Variables["User::StartReadingFromRow"].Value.ToString();
var directory = new DirectoryInfo(FolderPath);
FileInfo[] files = directory.GetFiles();
//Declare and initilize variables
string fileFullPath = "";
//Get one Book(Excel file at a time)
foreach (FileInfo file in files)
{
string filename = "";
fileFullPath = FolderPath + "\\" + file.Name;
//filename = file.Name.Replace(".xlsx", "");
filename = file.Name.Replace("'", " ");
MessageBox.Show(fileFullPath);
//Create Excel Connection
string ConStr;
string HDR;
HDR = "YES";
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=1\"";
OleDbConnection cnn = new OleDbConnection(ConStr);
//Get the sheetname and filename as columns
/* SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["Pulse_All_Tables"].AcquireConnection(Dts.Transaction) as SqlConnection);
string SQLColumnList = "";
string SQLQueryToGetMatchingColumn = "";
SqlCommand cmd = myADONETConnection.CreateCommand();
cmd.CommandText = SQLQueryToGetMatchingColumn;
SQLColumnList = (string)cmd.ExecuteScalar();*/
//Get Sheet Name
cnn.Open();
DataTable dtSheet = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetname;
sheetname = "";
//sheetname = sheetname.Replace(" ", string.Empty);
//string sheetname1 = "";
foreach (DataRow drSheet in dtSheet.Rows)
{
//if (drSheet["TABLE_NAME"].ToString().Contains("$"))
if (!drSheet["Table_Name"].ToString().Contains("FilterDatabase") && !drSheet["Table_Name"].ToString().EndsWith("$'"))
{
sheetname = drSheet["TABLE_NAME"].ToString();
//Display Sheet Name , you can comment it out
MessageBox.Show(sheetname);
//Load the DataTable with Sheet Data
//Get the sheetname and filename as columns
//OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + StartingColumn + StartReadingFromRow + ":" + EndingColumn + "]", cnn);
OleDbCommand oconn = new OleDbCommand("select " + "*" + ",'" + filename + "' AS FileName" + ",'" + sheetname + "' AS SheetName from [" + sheetname + StartingColumn + StartReadingFromRow + ":" + EndingColumn + "]", cnn);
//cnn.Open();
OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
DataTable dt = new DataTable();
adp.Fill(dt);
//drop $from sheet name
sheetname = sheetname.Replace("$", "");
//sheetname = sheetname.Replace((sheetname.Replace("$", "")),"_");
//sheetname1 = sheetname.Replace(" ", "");
// Generate Create Table Script by using Header Column,It will drop the table if Exists and Recreate
string tableDDL = "";
tableDDL += "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = ";
tableDDL += "OBJECT_ID(N'[dbo].[" + filename + "_" + sheetname + "]') AND type in (N'U'))";
tableDDL += "Drop Table [dbo].[" + filename + "_" + sheetname + "]";
tableDDL += "Create table [" + filename + "_" + sheetname + "]";
tableDDL += "(";
for (int i = 0; i < dt.Columns.Count; i++)
{
if (i != dt.Columns.Count - 1)
tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)" + ",";
else
tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)";
}
tableDDL += ")";
//use ADO.NET connection to Create Table from above Definition
SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["Pulse_All_Tables"].AcquireConnection(Dts.Transaction) as SqlConnection);
//you can comment the messagebox, it is for debugging
MessageBox.Show(tableDDL.ToString());
SqlCommand myCommand = new SqlCommand(tableDDL, myADONETConnection);
myCommand.ExecuteNonQuery();
//Comment this message, it is for debugging
MessageBox.Show("TABLE IS CREATED");
//Load the data from DataTable to SQL Server Table.
SqlBulkCopy blk = new SqlBulkCopy(myADONETConnection);
blk.DestinationTableName = "[" + filename + "_" + sheetname + "]";
blk.WriteToServer(dt);
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
使用系统;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
使用System.IO;
使用System.Linq;
使用System.Data.OleDb;
使用System.Data.SqlClient;
//使用System.Text.RegularExpressions;
名称空间ST_0762ccf78a5c4709b806530e3c885949
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
//公共静态字符串删除特殊字符(字符串str){return str.Replace(“[^A-Za-z0-9\\\\\.]”);
公共图书馆
{
字符串FolderPath=Dts.Variables[“User::FolderPath”].Value.ToString();
字符串StartingColumn=Dts.Variables[“User::StartingColumn”].Value.ToString();
字符串EndingColumn=Dts.Variables[“User::EndingColumn”].Value.ToString();
字符串StartReadingFromRow=Dts.Variables[“User::StartReadingFromRow”].Value.ToString();
var directory=newdirectoryinfo(FolderPath);
FileInfo[]files=目录.GetFiles();
//声明并初始化变量
字符串fileFullPath=“”;
//获取一本书(一次获取Excel文件)
foreach(文件中的文件信息文件)
{
字符串filename=“”;
fileFullPath=FolderPath+“\\”+file.Name;
//filename=file.Name.Replace(“.xlsx”,”);
filename=file.Name.Replace(“,”);
MessageBox.Show(fileFullPath);
//创建Excel连接
字符串构造;
字符串HDR;
HDR=“是”;
ConStr=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+fileFullPath+”;扩展属性=\”Excel 12.0;HDR=“+HDR+”;IMEX=1\”;
OLEDB连接cnn=新的OLEDB连接(ConStr);
//将sheetname和filename作为列获取
/*SqlConnection myADONETConnection=newsqlconnection();
myADONETConnection=(SqlConnection)(Dts.Connections[“Pulse\u All\u Tables”].AcquireConnection(Dts.Transaction)作为SqlConnection);
字符串SQLColumnList=“”;
字符串SQLQueryToGetMatchingColumn=“”;
SqlCommand cmd=myADONETConnection.CreateCommand();
cmd.CommandText=SQLQueryToGetMatchingColumn;
SQLColumnList=(字符串)cmd.ExecuteScalar()*/
//获取工作表名称
cnn.Open();
DataTable dtSheet=cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
字符串名称;
sheetname=“”;
//sheetname=sheetname.Replace(“,string.Empty);
//字符串sheetname1=“”;
foreach(dtSheet.Rows中的数据行drSheet)
{
//if(drSheet[“TABLE_NAME”].ToString()包含(“$”)
如果(!drSheet[“Table_Name”].ToString()包含(“FilterDatabase”)&&!drSheet[“Table_Name”].ToString().EndsWith($”)
{
sheetname=drSheet[“表名称”]。ToString();
//显示图纸名称,您可以将其注释掉
MessageBox.Show(sheetname);
//用图纸数据加载DataTable
//将sheetname和filename作为列获取
//OleDbCommand oconn=新的OleDbCommand(“从[”+sheetname+StartingColumn+StartReadingFromRow+”:“+EndingColumn+”],cnn中选择*);
OleDbCommand oconn=新的OleDbCommand(“选择“+”*“+”,“+filename+”'作为文件名“+”,“+sheetname+”,作为来自[“+sheetname+StartingColumn+startredingfromrow+”:“+EndingColumn+”],cnn)的sheetname);
//cnn.Open();
OleDbDataAdapter adp=新的OleDbDataAdapter(oconn);
DataTable dt=新的DataTable();
自动进料(dt);
//从工作表名称中删除$
sheetname=sheetname。替换(“$”,“”);
//sheetname=sheetname.Replace((sheetname.Replace(“$”,”),“”);
//sheetname1=sheetname.Replace(“,”);
//使用Header列生成createtable脚本,如果存在,它将删除该表并重新创建
字符串tableDDL=“”;
tableDDL+=“如果存在(从sys.objects中选择*,其中object_id=”;
tableDDL+=“对象ID(N'[dbo].“+filename+”[U'+sheetname+“]),并键入(N'U')”;
tableDDL+=“Drop Table[dbo]。”+filename+““+sheetname+”];
tableDDL+=“创建表[”+文件名+““+图纸名+”];
tableDDL+=“(”;
对于(int i=0;ioconn = new OleDbCommand("SELECT * FROM " + ("[" + dr["TABLE_NAME"].ToString() + "B1:B1]").Replace("'", ""), cnn);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Data;
using Microsoft.Win32;
namespace ConsoleApp13
{
class Program
{
static void Main(string[] args)
{
string fileName = "c:\\temp\\test.xlsx";
string ConStr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=NO;Empty Text Mode=NullAsEmpty""", fileName);
OleDbConnection cnn = new OleDbConnection(ConStr);
cnn.Open();
DataTable dt = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["TABLE_NAME"]);
//currently hardcoded B1:B1 - has to be replaced with your StartColumn:EndColumn logic
string cmd = "SELECT * FROM " + ("[" + dr["TABLE_NAME"].ToString() + "B1:B1]").Replace("'", "");
Console.WriteLine("\t"+cmd);
DataTable dt2 = new DataTable();
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(cmd, cnn);
da.Fill(ds);
dt2 = ds.Tables[0];
foreach(DataRow dr2 in dt2.Rows)
{
Console.WriteLine("\t" + dr2[0].ToString());
}
}
cnn.Close();
Console.WriteLine("Ende...");
Console.ReadKey();
}
}
}