将null excel单元格插入数据库中的空白单元格

时间:2015-10-13 14:25:13

标签: c# excel winforms sql-server-2014-express

我有一个简单的按钮事件,可以将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 |
|       |
|       |

3 个答案:

答案 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);
}

如需更多阅读,请点击此处链接。 ?:DBNull

答案 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);
            }