2017-04-04 74 views
1

我試圖導出一個從查詢中填充的數據表,但是我在最後一行收到一條帶有消息「無效單元值」的異常。將空數據庫值導出爲Excell

這隻有在列包含空值時纔會發生。 如何修改我的數據表以將空值替換爲字符串或將空值寫入Excel文件中作爲空格。

這是代碼,我有:

DataSet ds = new DataSet("New_DataSet"); 
DataTable dt = new DataTable("New_DataTable"); 
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; 
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; 
OracleDataAdapter adptr = new OracleDataAdapter(); 
try { 
    con.Open(); 
    var oracmd = con.CreateCommand(); 
    oracmd.CommandText = "select Column1,Column2 from Test";   
    adptr.SelectCommand = oracmd; 
    adptr.Fill(dt); 
    con.Close(); 

    ds.Tables.Add(dt); 

    SaveFileDialog saveFileDialog1 = new SaveFileDialog 
    { 
     Filter = "Excell files (*.xls)|*.xls"; 
     RestoreDirectory = true; 
    }; 

    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     ExcelLibrary.DataSetHelper.CreateWorkbook(saveFileDialog1.FileName, ds); 
+0

'xls'是舊的,過時,無證的格式。生成它的唯一可靠方法是在本地安裝Excel。過去12年中使用的格式「xlsx」已有詳細記錄,可以由各種SDK和庫直接生成。你可以使用像[EPPlus]這樣的庫(https://www.nuget.org/packages/EPPlus/)用一個簡單的'sheet.LoadFromDataTable(dt);'來生成一個真正的xlsx文件, ](https://epplus.codeplex.com/wikipage?title=WebapplicationExample)。 –

+0

'xls'也不*支持谷歌表和其他供應商沒有付費訂閱精確,因爲支持它花費他們的錢。 –

+0

完全同意Panagiotis,但要回答這個問題,只需使用Oracle的等效MSSQL的'ISNULL()'來替換空值或任何你想要的空值。 – Crowcoder

回答

0

我用這個方法,以檢查DataSet爲空valuse和替換它們:

public static DataSet DBNull(DataSet dataSet) 
    { 
     try 
     { 
      foreach (DataTable dataTable in dataSet.Tables) 
       foreach (DataRow dataRow in dataTable.Rows) 
        foreach (DataColumn dataColumn in dataTable.Columns) 
         if (dataRow.IsNull(dataColumn)) 
         { 
          if (dataColumn.DataType.IsValueType) dataRow[dataColumn] = Activator.CreateInstance(dataColumn.DataType); 
          else if (dataColumn.DataType == typeof(bool)) dataRow[dataColumn] = false; 
          else if (dataColumn.DataType == typeof(Guid)) dataRow[dataColumn] = Guid.Empty; 
          else if (dataColumn.DataType == typeof(string)) dataRow[dataColumn] = string.Empty; 
          else if (dataColumn.DataType == typeof(DateTime)) dataRow[dataColumn] = DateTime.MaxValue; 
          else if (dataColumn.DataType == typeof(int) || dataColumn.DataType == typeof(byte) || dataColumn.DataType == typeof(short) || dataColumn.DataType == typeof(long) || dataColumn.DataType == typeof(float) || dataColumn.DataType == typeof(double)) dataRow[dataColumn] = 0; 
          else dataRow[dataColumn] = null; 
         } 

      return dataSet; 
     } 
     catch (Exception ex) 
     { 
      return dataSet; 
     } 
    } 
+0

您可以保存自己的一些代碼,因爲列表中唯一不是值類型的類型是'String'。 – Crowcoder

+0

親愛的@Crowcoder我想你需要閱讀關於數據庫的值:D。你完全錯了。 – David

+0

你甚至沒有意識到數據庫的基本概念。 – David