この記事に出くわしたとき、私は SSIS と C# を介した Excel ファイルの処理を始めたばかりです。
この記事では、SSIS 経由で Excel データを SQL Server データベースに読み込む方法について説明します。
ただし、一部の select ステートメントの代わりに、特定の行 (たとえば行 9) からすべての行を抽出する必要があります。私の質問は、ヘッダー情報を使用せずに開始行を設定するには、どのコードを変更/消去する必要があるかということです。
public SourceFileDetails ScanRows(DataSet excelDataSet, string ExtractionStatement, string FindColumn)
{
if (excelDataSet.Tables.Count < 1)
return (SourceFileDetails)null;
string ExtractFields = this.ReplaceString(this.ReplaceString(ExtractionStatement, "SELECT", ""), "From [Data$]", "");
List<string> FindStrings = ExtractFields.Split(',').Select(s => s.Trim().Replace("[", "").Replace("]", "").Replace("#", ".").Replace("(", "").Replace(")", "")).ToList();
foreach (DataTable dt in excelDataSet.Tables)
{
List<ItemValueHolder> FoundAddress = new List<ItemValueHolder>();
int iDuplicates = 0;
foreach (DataRow dr in dt.Rows)
{
int iItemColumnIndex = 0;
foreach (var fieldValue in dr.ItemArray)
{
object cellData = fieldValue;
string sCellData = cellData.ToString().Replace("#", ".").Replace("[", "").Replace("]", "").Replace("(", "").Replace(")", "");
if (cellData != null)
if (FindStrings.Exists(delegate(string k) { return k.ToLower() == sCellData.ToString().ToLower(); }))
{
if (!FoundAddress.Exists(delegate(ItemValueHolder t) { return t.Item.ToLower() == sCellData.ToLower(); }))
FoundAddress.Add(new ItemValueHolder(sCellData, dt.Rows.IndexOf(dr), iItemColumnIndex));
else
iDuplicates++;
}
iItemColumnIndex++;
}
int iTotalFields = FindStrings.Count - iDuplicates;
if (100 * FoundAddress.Count / (float)iTotalFields >= 90.00)
{
var query = FoundAddress.GroupBy(
item => item.ItemValue,
(itemvalue, items) => new
{
Key = (int)itemvalue,
Count = items.Count(),
});
int dataStartAddress = (from p in query
where p.Count == (query.Max(it => it.Count))
select p.Key).Max();
dataStartAddress += 1;
string SheetName = "[" + dt.TableName + "$A" + dataStartAddress.ToString() + ":IV]";
string _selectCommand = this.ReplaceString(ExtractionStatement, "[Data$]", SheetName);
string reportDate = "";
if (!string.IsNullOrEmpty(FindColumn))
try
{
int ColIndex = (from p in FoundAddress
where p.Item.ToLower() == FindColumn.ToLower()
select p.ColumnIndex).First();
DataRow drRowReport = dt.Rows[dataStartAddress];
reportDate = drRowReport[ColIndex].ToString();
}
catch (Exception e)
{
//log
}
string NewFields = GetNewFieldsAtSource(FindStrings, dr);
return new SourceFileDetails("", "", "", _selectCommand, reportDate, NewFields);
}
}
}
return (SourceFileDetails)null;
}
どうもありがとう!