私はこのような値でExcelスプレッドシート内のデータを持っています:
- 0.69491375
- 0.31220394
細胞は、パーセンテージとして書式設定、および小数点以下を表示するように設定されています。そこで、彼らはとしてExcelで表示されます。
- 69.49パーセント
- 31.22パーセント
私はオフ、このデータを解析し、C#のプログラムを持っています Clipboard
。
var dataObj = Clipboard.GetDataObject();
var format = DataFormats.CommaSeparatedValue;
if (dataObj != null && dataObj.GetDataPresent(format))
{
var csvData = dataObj.GetData(format);
// do something
}
問題は、それがある csvData
'69 0.49パーセント「と'31 0.22パーセント」すなわち、Excelから表示値が含まれています。これは、余分な小数点以下の完全な精度が含まれていません。
私は、様々な異なる使用しようとしている DataFormats
など、値を、そのデータは今までExcelから表示値が含まれています。
DataFormats.Dif
DataFormats.Rtf
DataFormats.UnicodeText
- 等
テストとして、私はLibreOfficeのCalcのコピーをインストール/ CalcのにExcelから同じセルを貼り付けました。Calcは、生データの完全な精度を保持します。
だから、はっきりとExcelは、他のプログラムがアクセスできることをどこかで、このデータを置きます。どのように私はC#アプリケーションからアクセスすることができますか?
編集 - 次のステップ。
私は、LibreOfficeのCalcのソースコードをダウンロードしたと私は、彼らがExcelからコピーしたデータの完全なコンテキストを取得する方法を見つけることができるかどうかを確認するために周り突くを持っています。
私もやった GetFormats()
クリップボードから返されたデータオブジェクトの呼び出しをしてしていないそのうちのいくつかは24個の異なるデータ形式のリストだ DataFormats
列挙型を。これらのような形式で含まれ Biff12
、 Biff8
、 Biff5
、 Format129
私には慣れていない他のフォーマットの中に、私はどんな発見をする場合、私はこれらを調査し、対応よ...
また、どちらかではない完全な答えが、問題にさらにいくつかの洞察:
あなたは、単一のExcelのセルをコピーすると、次に何がクリップボードになってしまいます順番に単一のセルが含まれている1つのスプレッドシートが含まれている完全なExcelワークブックであります:
var dataObject = Clipboard.GetDataObject();
var mstream = (MemoryStream)dataObject.GetData("XML Spreadsheet");
// Note: For some reason we need to ignore the last byte otherwise
// an exception will occur...
mstream.SetLength(mstream.Length - 1);
var xml = XElement.Load(mstream);
コンソールへのXElementの内容をダンプするとき今、あなたは確かに完全なExcelワークブックを得ることがわかります。また、「XMLスプレッドシート」形式は、セルに格納された数値の内部表現を含みます。だから私はあなたが必要なデータを取得するためにLINQのからXMLまたは類似を使用することができると思います:
XNamespace ssNs = "urn:schemas-microsoft-com:office:spreadsheet";
var numbers = xml.Descendants(ssNs + "Data").
Where(e => (string)e.Attribute(ssNs + "Type") == "Number").
Select(e => (double)e);
私はまた、使用してビフ形式読んしようとした Excelデータリーダーを 結果のデータセットは常に空の出てきたが...
BIFF形式は、Microsoftがオープンな仕様です。(私は仕様が標準ではないと言うことに、注意してください)。リードを付けて 、この 何が起こっているかのアイデアを得るために。
そして、あなたが見たものBIFFは、一部のExcelのフォーマットに対応しています。BIFF5は、Excel 5.0の95からXLSある、BIFF8は、2003エクセル97からXLSで、BIFF12は、Excel 2007はまた、(私もエクセル2010を推測)、それらを作り出すことができることに注意し、Excel 2003のからXLSBです。いくつかのドキュメントがあり 、ここで 、また ここに あなたがそこにバイナリの意味を作るのを助けること(OpenOfficeのから)は...
とにかく、いくつかの作業があり、VB、C ++、Javaでこの文書を解析するために、過去に行われ、C#であなたの好みのためにされています。たとえば、この BIFF12リーダー、プロジェクト NExcel、および ExcelLibraryは いくつかを引用します。
特にNExcelは、あなたがクリップボードのデータから作成し、そのデータを取得するためにNExcelを照会することができるストリームを渡すことができます。あなたがソースコードを取るしようとしている場合、私はExcelLibraryがはるかに読みやすいと思います。
あなたは、このようなストリームを取得することができます:
var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
var stream = (System.IO.Stream)dataobject.GetData(format);
そして、このようなものになるだろうNExcelとの流れを形成読んで:
var wb = getWorkbook(stream);
var sheet = wb.Sheets[0];
var somedata = sheet.getCell(0, 0).Contents;
私はマイクロソフトからの実際のOfficeのライブラリがあまりにも働くだろうと思います。
私は、これは全体の物語ではありません知っている、それが起こっているかを共有してください。私はチャンスを得る場合には、それをしようとします。
私はExcelからコピーすると、クリップボードには、24本の形式を保持しています!
System.Windows.Clipboard.GetDataObject().GetFormats().Dump();
- EnhancedMetafile
- System.Drawing.Imaging.Metafile
- METAFILEPICT
- ビットマップ
- System.Drawing.Bitmap
- System.Windows.Media.Imaging.BitmapSource
- Biff12
- BIFF8
- BIFF5
- SymbolicLink
- データ交換フォーマット
- XMLスプレッドシート
- HTMLフォーマット
- テキスト
- UnicodeText
- 可能System.String
- CSV
- リッチテキスト形式
- 埋め込みソース
- オブジェクト記述子
- リンクソース
- リンクソース記述子
- リンク
- Format129