C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: エクセルファイルへの高速アクセス


(過去ログ 139 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■81954 / inTopicNo.1)  エクセルファイルへの高速アクセス
  
□投稿者/ むぅ (15回)-(2016/11/25(Fri) 00:17:10)

分類:[.NET 全般] 

Win7 32/64bit Vs2015

お世話になります。
2次元配列を使ったエクセルシートへの高速アクセスする方法で、値だけでなく、
セルの背景色やフォントカラーなど、他の属性も扱うことはできないでしょうか。

以下のような感じなのですが、これだと実行時エラーがでます。

 Excel.Range rgn2 = ws.Range(ws.Cells[nRow, 1], ws.Cells[nRow, nMaxCol]);
 System.Object[,] ob = (System.Object[,])rgn2.Interior.Color;

 型 'System.Double' のオブジェクトを型 'System.Object[,]' にキャストできません。

エラーメッセージにあるように配列として扱われていないようです。
何か良い方法はないでしょうか。

よろしくお願いします。


引用返信 編集キー/
■81957 / inTopicNo.2)  Re[1]: エクセルファイルへの高速アクセス
□投稿者/ むぅ (16回)-(2016/11/25(Fri) 08:16:47)
すいません。該当プログラムでNetOfficeを使っているため、若干書式が変わっております。
NetOfficeに関係なく、セル書式への高速なアクセスでよい方法がありましたらご教示のほど、
お願いしますm(__)m。
引用返信 編集キー/
■81958 / inTopicNo.3)  Re[1]: エクセルファイルへの高速アクセス
□投稿者/ 魔界の仮面弁士 (986回)-(2016/11/25(Fri) 09:03:52)
No81954 (むぅ さん) に返信
> セルの背景色やフォントカラーなど、他の属性も扱うことはできないでしょうか。

そのためのインターフェイスは、Clipboard 経由で
ペーストする方法だけだと思います。
Range.PasteSpecial とか Worksheet.Paste とか。
引用返信 編集キー/
■81959 / inTopicNo.4)  Re[2]: エクセルファイルへの高速アクセス
□投稿者/ 魔界の仮面弁士 (987回)-(2016/11/25(Fri) 10:01:23)
No81958 (魔界の仮面弁士) に追記
>>セルの背景色やフォントカラーなど、他の属性も扱うことはできないでしょうか。
>
> そのためのインターフェイスは、Clipboard 経由で
> ペーストする方法だけだと思います。
> Range.PasteSpecial とか Worksheet.Paste とか。

Range.PasteSpecial なサンプルを書いておきます。

セル A1:D6 の範囲(source) の6行4列分の書式情報を、
セル A11:H34 の範囲(destination) の24行8列に、
一括転記しています。

xlPasteFormats を指定しているため、書式情報のみ転記され、
コピー先にあった値や数式はそのまま保持されます。


static void Main()
{
  // dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
  Excel.Application app = new Excel.Application();
  app.Visible = true;
  // dynamic books = app.Workbooks;
  Excel.Workbooks books = app.Workbooks;
  // dynamic book = books.Add(@"C:\temp\Book2007.xlsx");
  Excel.Workbook book = books.Add(@"C:\temp\Book2007.xlsx");
  // dynamic worksheets = book.Worksheets;
  Excel.Sheets worksheets = book.Worksheets;
  // dynamic sheet1 = worksheets["Sheet1"];
  Excel.Worksheet sheet1 = worksheets["Sheet1"];
  // dynamic cells = sheet1.Cells;
  Excel.Range cells = sheet1.Cells;
  // dynamic lt, rb, source = sheet1.Range[lt = cells[1, 1], rb = cells[6, 4]];
  Excel.Range lt, rb, source = sheet1.Range[lt = cells[1, 1], rb = cells[6, 4]];
  // dynamic destination = sheet1.Range["A11:H34"];
  Excel.Range destination = sheet1.Range["A11:H34"];

  source.Copy();
  // destination.PasteSpecial((object)/*xlPasteFormats*/-4122);
  destination.PasteSpecial(Excel.XlPasteType.xlPasteFormats);
  // app.CutCopyMode = false;
  app.CutCopyMode = default(Excel.XlCutCopyMode);

  Release(ref destination);
  Release(ref source);
  Release(ref rb);
  Release(ref lt);
  Release(ref cells);
  Release(ref sheet1);
  Release(ref worksheets);
  book.SaveAs(@"C:\temp\newBook.xlsx");
  Release(ref book);
  Release(ref books);
  app.Quit();
  Release(ref app);
}

static int Release<T>(ref T obj, bool force = false) where T : class
{
  int refCount = 0;
  if (obj != null && Marshal.IsComObject(obj))
  {
    if (force) refCount = Marshal.FinalReleaseComObject(obj);
    else refCount = Marshal.ReleaseComObject(obj);
    obj = null;
  }
  return refCount;
}
引用返信 編集キー/
■81977 / inTopicNo.5)  Re[3]: エクセルファイルへの高速アクセス
□投稿者/ むぅ (17回)-(2016/11/26(Sat) 21:11:06)
魔界の仮面弁士様
おせわになります。
詳細なコードまでご提示いただき、ありがとうございました。

やはり、2次元配列ではアクセス不可ということで、了解しました。
複写する方法も一部処理に活用できそうなので活用しつつ、全体の
パフォーマンス改善をはかってみます。

かさねがさね、ありがとうございました。

                   以上
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -