2016-06-16 8 views
0

すべての書式設定されたテキストをExcelスプレッドシートから取得する必要があります。ExcelからDocumentTextを取得

私はこれをより良い解決策にする必要があります。これは私の目標を達成しますが、まったくスケールしません!

StringBuilder strData = new StringBuilder(); 
var worksheets = ReferenceDocument.Worksheets; 
foreach (Excel._Worksheet worksheet in worksheets) 
{ 
    foreach (var cell in worksheet.UsedRange.Cast<Excel.Range>()) 
    { 
     object value = cell.Text; 
     string strValue = value == null ? null : value.ToString(); 
     if (!String.IsNullOrWhiteSpace(strValue)) strData.AppendLine(strValue); 
    } 
} 

編集:私は、文字列の配列を取得するためにworksheet.UsedRange.Textを呼び出して試してみたが、残念ながらそれはSystem.DbNullではなく配列を返します。

+0

2つのプロセス(C#とExcel)間の個々の呼び出しの数を減らす必要があります。おそらくこれを達成する最良の方法は、 'UsedRange'を配列に読み込んで、その配列を.NETで処理することです。http://stackoverflow.com/questions/910400/reading-from-excel-range-into-multidimensional -array-c-sharp –

+0

残念ながらrange.Textを呼び出すと、System.DbNull – tdemay

答えて

0

私が使用できるExcelオブジェクトモデルで何も見つかりませんでした。私はOleDbを使用して問題を解決しました。

StringBuilder strData = new StringBuilder(); 
ReferenceDocument.SaveCopyAs(strSomeTempFile); 
var cnnStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended properties=\"Excel 8.0;IMEX=1;HDR=NO\"", strSomeTempFile); 
var cnn = new OleDbConnection(cnnStr); 
try 
{ 
    cnn.Open(); 
    var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
    foreach(DataRow schemaRow in schemaTable.Rows) 
    { 
     string worksheetName = schemaRow["table_name"].ToString().Replace("'", ""); 
     string sql = String.Format("select * from [{0}]", worksheetName); 
     var da = new OleDbDataAdapter(sql, cnn); 
     var dt = new DataTable(); 
     da.Fill(dt); 
     foreach (DataRow row in dt.Rows) 
     foreach (DataColumn col in dt.Columns) 
     { 
      var value = row[col.ColumnName]; 
      if (!(value is System.DBNull)) strData.AppendLine(value.ToString()); 
     } 
    } 
} 
catch (Exception e) 
{ 
    // handle error 
    throw; 
} 
finally 
{ 
    cnn.Close(); 
} 
return strData; 
関連する問題