DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#、OpenXml 2.5によるシートコピー後のOleDbによるシートへの書き込み

環境/言語:[Windows7 Professional 64bit、Visual Studio 2010 Professional、.Net Framework 4.0]
分類:[ASP.NET]

こちらへは初めて投稿いたします。
よろしくお願いします。

現在の構築環境
Windows7 Professional 64bit
Visual Studio 2010 Professional
.Net Framework 4.0
OpenXML SDK 2.5 (http://www.microsoft.com/en-us/download/details.aspx?id=30425)
AccessDataEngine (http://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
Excelの形式は2007以降(xlsx)
(ちなみに現在使っているのは、Office 2013です)

Excel(xlsx)を新規作成、その中にSheet1という名前のシートが1シートだけあり、A2のセルに、
あいうえお
と入力しただけのsample.xlsxというファイルがあります。
セルの書式などは変更していません。

C#側で、このsample.xlsxをコピー、copied.xlsxというファイルを作成し、OpenXMLを用いて、Sheet1のシートをコピーしSheet2を作成、OleDbよりシート内のセルに値を書き込みという処理を行っています。

シートのコピーは、
http://blogs.msdn.com/b/brian_jones/archive/2009/02/19/how-to-copy-a-worksheet-within-a-workbook.aspx?Redirected=true
をそっくりそのまま使用しています。

シートのコピーまでは、問題なく行われるのですが、OleDbを使用してセルの値を設定した場合、Sheet1は問題ないものの、Sheet2では、値が反映されません。
とはいえ、Sheet2のA2のセルにある
あいうえお
は空白になっているため、SQLの実行自体は問題ないようです。
実際、OpenXMLを使用せずにExcelからシートをコピーしてSheet2を作成し、OleDbで値を設定した場合は問題なく値がセットされます。

上記理由から、Excelでシートを増やしたxlsxファイルとOpenXMLのシートのコピーで生成されたxlsxファイルを作成し、それぞれのファイルの拡張子をzipに変更、解凍して、出来上がったxmlファイルを比較してみましたが、OpenXMLを最近始めた私の力ではそれをOpenXMLのコピー処理にどうやって組み込んだらよいのか、皆目見当も付きません。

Excelからシートをコピーしたxmlの形式と、OpenXMLでコピーして出来上がったxmlのファイルの構成が同じならいけるんではないかと思ったのですが…

実際にはASP.NET(C#)で同様の処理を実装しています。
シートのコピーはデータベース(SQL SERVER)より取得したカラムの結果により、動的にシートのコピーを行わなければならないため、予めシートを作成しておくといった類のことはできません。

また、OleDb側でCreate Tableをすることでは実現できません。
Sheet1には実際には罫線の指定や、値の埋め込み、タイトル行の設定等がなされているためです。

実は非常に簡単なことなのかもしれませんが行き詰ってしまい、皆様のお力をお借りできれば幸いです。

以上、よろしくお願い致します。
添付ファイル: copySheetSample.zip (47 KB)
■No32087に返信(gariさんの記事)
> 現在の構築環境
> Windows7 Professional 64bit
> Visual Studio 2010 Professional
> .Net Framework 4.0
> OpenXML SDK 2.5 (http://www.microsoft.com/en-us/download/details.aspx?id=30425)
> AccessDataEngine (http://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
> Excelの形式は2007以降(xlsx)
> (ちなみに現在使っているのは、Office 2013です)
>
アップされていたコードで俺の環境ではうまく動いていました。
(sheet1のA2セル:かきくけこ、sheet2のA2セル:かきくけこ)
Sheet1, Sheet2でupdateする文字列を変えても動いてました。
「sample.xlsx」を「sample_old.xlsx」に差し替えても動作してました。

環境:
Win7 32bit Pro(←ちょっと違う。)
Visual Studio 2010 Express
.Net Framework 4.0
OpenXML SDK 2.5(新規にインストール)
AccessDataEngine(既に入っていたみたい)
でき上ったシートをExcel 2007で確認
■No32088に返信(aさんの記事)
> ■No32087に返信(gariさんの記事)
>>現在の構築環境
>>Windows7 Professional 64bit
>>Visual Studio 2010 Professional
>>.Net Framework 4.0
>>OpenXML SDK 2.5 (http://www.microsoft.com/en-us/download/details.aspx?id=30425)
>>AccessDataEngine (http://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
>>Excelの形式は2007以降(xlsx)
>>(ちなみに現在使っているのは、Office 2013です)
>>
> アップされていたコードで俺の環境ではうまく動いていました。
> (sheet1のA2セル:かきくけこ、sheet2のA2セル:かきくけこ)
> Sheet1, Sheet2でupdateする文字列を変えても動いてました。
> 「sample.xlsx」を「sample_old.xlsx」に差し替えても動作してました。
>
> 環境:
> Win7 32bit Pro(←ちょっと違う。)
> Visual Studio 2010 Express
> .Net Framework 4.0
> OpenXML SDK 2.5(新規にインストール)
> AccessDataEngine(既に入っていたみたい)
> でき上ったシートをExcel 2007で確認

a様

検証していただいたようで、ありがとうございます。
うまくいったということですので、もしかすると環境周りなのかもしれませんね…
私の環境では、未だうまくいきません…
またこちらの同開発メンバーにも試してもらいましたが、やはりうまくいきません…
ちなみにそのメンバーの環境は、
Win7 Pro(32bit)
Officeは2010
というところが私と違っています…

元になるExcelを作ったバージョンにもよるんでしょうかねぇ…
元になるExcelもExcel 2013で作ったものですので…
ただ、a様の環境ではうまくいってるとのことですので、関係ないかもですが…

うまくいく環境もあるとのことなので、その辺から原因調査します。
報告ありがとうございます。
2014/02/04(Tue) 19:02:34 編集(投稿者)
2014/02/04(Tue) 19:02:26 編集(投稿者)

遅くなりましてすみません。
その後以下を試してみましたが、状況は変わりませんでした。

OpenXML のバージョンを2.0にする。
AccessDataEngineを64bit版にする。
元になるxlsxをLibreOfficeで作成する。

今回の案件では、元になるxlsxに必要最大数と思われるシートをあらかじめ作成しておき、必要がなければシートを削除する。
というやり方で行うこととなりました。

シートの削除はこちらのをほぼそのまま使用
http://blogs.msdn.com/b/vsod/archive/2010/02/05/how-to-delete-a-worksheet-from-excel-using-open-xml-sdk-2-0.aspx

個人的には悔しいですが、解決済みといたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板