2015-10-13 243 views
1

我有一个简单的按钮事件来将excel表单导入到数据库中。的码片/部分是这样的..在数据库中插入空的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表列 - '注意' 是像

| Check | 
|  | 
|  | 

它当前插入DB等

| Check | 
|<Notes>| 
|<Notes>| 

我希望它是这样的空白插入为空白

| Check | 
|  | 
|  | 

回答

1

替换内部'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 { Temp1 = "" ; }

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

1

第一个问题是,您没有任何逻辑来捕获“null”excel单元 - 您只需要捕获非空单元的代码。

其次,在这段代码中一个单元格永远不会为空,因为你在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); 
      } 
相关问题