2017-06-29 16 views
0

この質問は私の最後のポスト(link)に関連しているの各セルをループ。私は、非ASCII値(関数ReturnCleanASCII)の私のシートをきれいにすることができるように、このために使用されている各セルを通過します。しかし、私はセルを通過するときにnull値を取得しています。エクセル/ CSV形式のシート

コード

foreach (Excel.Range range in xlRange.Cells){ 
      Console.WriteLine(range.Value2.ToString()); 
} 

私は、各セルを通過する上記のコードを使用しています。これは、各セルを通過する不正な方法ですか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Excel.Application xlApp = new Excel.Application(); 
      Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\username\Desktop\Error Records.csv"); 
      Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1]; 
      Excel.Range xlRange = xlWorksheet.UsedRange; 

      int lastUsedRow = xlWorksheet.Cells.Find("*", System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, System.Reflection.Missing.Value, 
       Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious, 
       false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Row; 

      int lastUsedColumn = xlWorksheet.Cells.Find("*", System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, System.Reflection.Missing.Value, 
       Excel.XlSearchOrder.xlByColumns, Excel.XlSearchDirection.xlPrevious, 
       false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Column; 

      int lastColumnCount = lastUsedColumn; 



      for (int i = 1; i <= lastUsedColumn; i++) 
      { 
       for (int j = 1; j <= lastUsedRow; j++) 
       { 
        xlWorksheet.Cells[j, (lastColumnCount + 1)] = "Testing data 134"; 
       } 
      } 

      foreach (Excel.Range range in xlRange.Cells) 
      { 
       Console.WriteLine(range.Value2.ToString()); 
      } 


      xlWorksheet.Cells[1, (lastUsedColumn + 1)] = "Title"; 
      xlWorkbook.Save(); 
      //cleanup 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      //rule of thumb for releasing com objects: 
      // never use two dots, all COM objects must be referenced and released individually 
      // ex: [somthing].[something].[something] is bad 

      //release com objects to fully kill excel process from running in the background 
      Marshal.ReleaseComObject(xlRange); 
      Marshal.ReleaseComObject(xlWorksheet); 

      //close and release 
      var data = ReturnCleanASCII(xlWorksheet.ToString()); 
      xlWorkbook.SaveAs("C:\\Users\\username\\Desktop\\Errors_four.csv".Trim(), Excel.XlFileFormat.xlCSV); 
      xlWorkbook.Close(); 
      Marshal.ReleaseComObject(xlWorkbook); 

      //quit and release 
      xlApp.Quit(); 
      Marshal.ReleaseComObject(xlApp); 

     } 

     public static string ReturnCleanASCII(string s) 
     { 
      StringBuilder sb = new StringBuilder(s.Length); 
      foreach (char c in s.ToCharArray()) 
      { 
       if ((int)c > 127) // you probably don't want 127 either 
        continue; 
       if ((int)c < 32) // I bet you don't want control characters 
        continue; 
       if (c == ',') 
        continue; 
       if (c == '"') 
        continue; 
       sb.Append(c); 
      } 
      return sb.ToString(); 
     } 
    } 
} 

エラー:

Cannot perform runtime binding on a null reference

スタックトレース:

at CallSite.Target(Closure , CallSite , Object) 
    at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) 
    at CallSite.Target(Closure , CallSite , Object) 
    at ConsoleApplication1.Program.Main(String[] args) in C:\Users\username\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 44 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

@Dai、申し訳ありません間違ったタグについて – Maddy

+0

stacktraceはあなたに何を伝えますか? –

+0

@ JoePhillips、そ​​れはちょうど最初の行を読み込みます。 – Maddy

答えて

1

使用Convert.ToString(range.Value2)ではなくrange.Value2.ToString()

参照:Cannot perform runtime binding on a null reference - Empty Excel Cells

+0

ための編集内容を確認してください –

+0

助けてくれてありがとう、私はそれを試みました。私はしばらくそれにこだわっていたので、それを逃したかもしれないと思います。 – Maddy