我有一个简单的按钮事件,可以将Excel工作表导入数据库。代码的一部分/部分是这样的..
private void button6_Click(object sender, EventArgs e)
{
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm;*.xltm;*.xltx";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
try
{
foreach (var worksheetx in Workbook.Worksheets(theDialog.FileName.ToString()))
{
foreach (var row in worksheetx.Rows)
{
String Temp = @"INSERT INTO [dbo].[myTable]
([Status]
,[NName]
,[Notes]
)
VALUES
('<Status>'
,'<NName>'
,'<Notes>'
)";
String Temp1 = Temp;
bool ForceContinue = false;
foreach (var cell in row.Cells)
{
if (cell != null)
{
if (cell.ColumnIndex == 0)Temp1 = Temp1.Replace("<Status>", cell.Text);
if (cell.ColumnIndex == 1)Temp1 = Temp1.Replace("<NName>", cell.Text);
if (cell.ColumnIndex == 2)Temp1 = Temp1.Replace("<Notes>", cell.Text);
}
else
{
//Looking for this part- How to insert 'NULL' or Blank cell.Text
}
}
DBConn.Execute(Temp1);
例如,如果我的Excel工作表列 - &#39;注意&#39;就像
| Check |
| |
| |
目前已插入数据库
| Check |
|<Notes>|
|<Notes>|
我希望它像空白一样插入空白
| Check |
| |
| |
答案 0 :(得分:1)
替换内部'foreach(row.Cells中的var cell)'中的代码块,并将其替换为下面编写的代码。
if (cell != null)
{
if (cell.ColumnIndex == 0)Temp1 = Temp1.Replace("<Status>", cell.Text);
if (cell.ColumnIndex == 1)Temp1 = Temp1.Replace("<NName>", cell.Text);
if (cell.ColumnIndex == 2)Temp1 = Temp1.Replace("<Notes>", cell.Text);
}
else
{
Temp1 = "" ;
}
答案 1 :(得分:1)
尝试将?:运算符与DBNull结合使用,而不是if语句。
foreach (var cell in row.Cells)
{
if (cell.ColumnIndex == 0) Temp1 = Temp1.Replace("<Status>", string.IsNullOrWhiteSpace(cell.Text) ? DBNull.Value : cell.Text);
if (cell.ColumnIndex == 1) Temp1 = Temp1.Replace("<NName>", string.IsNullOrWhiteSpace(cell.Text) ? DBNull.Value : cell.Text);
if (cell.ColumnIndex == 2) Temp1 = Temp1.Replace("<Notes>", string.IsNullOrWhiteSpace(cell.Text) ? DBNull.Value : cell.Text);
}
答案 2 :(得分:1)
第一个问题是您没有任何逻辑来捕获“null”excel单元格 - 您只需要捕获非空单元格的代码。
其次,此代码中的单元格永远不会为null,因为您只是将其实例化为foreach循环中的对象。但是,属性Value,Value2或Text可能为空或空。检查适当的属性是否空虚。
根据您要执行的操作,请使用此检查:
if (cell.Value != null)
或
if (String.IsNullOrEmpty(cell.Text))
,但我认为您甚至不需要检查,因为您的替换方法会自动执行此操作。
第三,也许我有不同的Excel互操作语言,但这甚至都不能为我编译:
if (cell.ColumnIndex == 0)
我能够使用:
if (cell.Column == 0)
但是这引发了异常,因为Excel将列编号从1开始,而不是0。
第四,你有一个很长的foreach循环来遍历每一行。试试这个来缩短处理时间:
foreach (Range row in sheet.UsedRange)
第五,每次都不需要实例化字符串Temp。在第一个循环之前移动该代码。
最后,我只是用这段代码替换了相应的文字:
foreach (Range cell in row.Cells)
{
if (cell.Column == 1) Temp1 = Temp1.Replace("<Status>", cell.Text);
if (cell.Column == 2) Temp1 = Temp1.Replace("<NName>", cell.Text);
if (cell.Column == 3) Temp1 = Temp1.Replace("<Notes>", cell.Text);
}