2017-06-29 18 views
2

excel/csvファイルからASCII以外の文字をすべて削除しようとしています。オンラインで読むと検索すると、私は文字を取り除くためにコードxlWorksheet.UsedRange.Replace("[^\\u0000-\\u007F]"を与えた投稿を見つけましたが、文字はまだファイルに存在しています。ASCII以外の文字を削除する(Microsoft.Office.Interop.Excelを使用)

はまた、私たちは置き換えるために何かを見つけることができませんでした

を示すダイアログボックスを取得します。 検索のその他の方法については、[オプション]をクリックしてください。

FYI:置き換えようとしているデータが保護された シートにある可能性があります。 Excelは保護されたシートのデータを置き換えることはできません。

さらに進める方法がわかりません。私はオンラインで見て読んでいますが、これまでのところ有用なものは何も見つかりませんでした。

ありがとうございました。各範囲内

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"; 
//    } 
//   } 

      xlWorksheet.Cells[1, (lastUsedColumn + 1)] = "Title"; 
      xlWorksheet.UsedRange.Replace("[^\\u0000-\\u007F]", string.Empty); 

      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 
      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); 

     } 
    } 
} 
+0

ExcelはRegexスタイルの置換をサポートしていないため、各セルをループして内容を文字列として抽出し、文字列の置換えをセルに戻して割り当てます。 – PaulF

答えて

0

foreachのセルには、クリーンアップアスキーで、現在のセルの文字列値を交換するには、次の機能を使用することができます。私は、Excel interopライブラリに固有のascii変換関数を認識していません。私は好奇心が強いです、変換しようとしていることをあなたが提供できる例がありますか?

ファンクションがあり、ExcelシートにはVALUESがあることにも注意してください。あなたの質問にはあなたがどのようなことをしようとしているのかははっきりしていません。あなたは私がこれらが純粋に価値のある操作だと思うようにするCSVに言及しました。

public 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(); 
} 

ここでは使用例を示します。自分でセルのインデックスを作成する方法を理解する必要があることに注意してください。この例はセル1,1のみで動作します。また、2つの役立つヒント:セルは1のインデックスが付けられており、Valueの代わりにValue2を呼び出すと高速になる場合があります。

// get the value from a cell 
string dirty = excelSheet.Cells[1, 1].Value.ToString(); // Value2 may be faster! 

// convert to clean ascii 
string clean = ReturnCleanASCII(dirty); 

// set the cell value 
excelSheet.Cells[1, 1].Value = clean; 
+0

xlWorkSheetを文字列ビルダーにどのように渡すことができないのかよくわかりません。少し説明できますか? – Maddy

+0

確かに、私の編集をチェックしてください。 – sapbucket

+0

返信いただきありがとうございます。私が何を実装しているかについてのちょっとした質問。 { ストリングダーティ=のxlWorksheet.Cells [I、J] .Valueの {ため (J ++ INT J = 1; J <= lastUsedColumn(); I <= lastUsedRow I ++は、I = 1 INT)ため .ToString(); string clean = ReturnCleanASCII(ダーティ); xlWorksheet.Cells [i、j] .Value = clean; } } これは問題ありませんか? – Maddy

関連する問題