2010-10-07 35 views
0

我使用這個簡單的如何拖動內容時到Excel

IDataObject data = new DataObject(); 
string textToExcel = "Hello\tWorld\t1\t2\nHello\tWorld\t1\t2\n" 
data.SetData(DataFormats.Text, textToExcel); 

當Excel的下降我工作正常啓動拖放從我的WinForms應用程序指定的數據類型,它在列和行很好地結束了。 問題是Excel不知道值爲1和2的單元格是數字 ,並且在刪除日期值時它變得更糟。

如何告訴Excel單個單元格的數據類型,是否有一些更豐富的類型,Excel在內容被放入時會接受。

回答

1

所有您能夠通過拖放到Excel進行通信都是字符串,如果可以,Excel將自動轉換爲日期或數字類型。如果您不希望它將可識別的類型轉換爲數據類型,那麼您應該使用'100'而不是100來開始該值。

如果您希望完全控制,您應該訂閱將在拖放操作結束時觸發的Excel.Worksheet.Change事件。此時,您可以對自己的數據進行自定義轉換。如果您將數據作爲自定義格式傳輸,而不是由Excel自動轉換,那麼這將很方便。例如,而不是發送值的2×2塊,如:

100 Hello 
$1.25 10/9/2010 

您可以通過爲發送:

<DragDrop:Double>100</Double> <DragDrop:String>Hello</String> 
<DragDrop:Currency>1.25</Currency> <DragDrop:Date>2010.10.9</Date> 

這些值將由接收細胞作爲字符串。但是,當Worksheet.Change事件觸發時,它會告訴您哪些單元格已更改,並且您的例程可以處理這些字符串,查找以"<DragDrop:"開頭的任何內容。然後,您可以將這些轉換爲字符串本身中指定的所需數據類型。

有關詳細示例,請參見文章Adding Drag-and-Drop Functionality using the .NET Framework and Visual Studio 2005 Tools for Office Second Edition。在那篇文章中,他們使用了一個比"<DragDrop:"更獨特的例子 - 它們在字符串的前面使用GUID來確保字符串是唯一且可識別的。但基本策略就像我上面所描述的那樣。

希望這有助於

邁克

+0

謝謝,我很害怕,我需要做一些定製擅長黑客。 – 2010-10-10 15:52:49

+0

您不會知道如何將日期/時間格式化爲字符串,以便excel檢測日期格式。 – 2010-10-10 15:53:51

+0

有許多Excel可以解釋爲日期的字符串。我會小心使用一個明確的字符串,例如「2010年10月11日」而不是「2010年10月11日」,它將在2010年10月11日在美國系統上解釋,但可能會被解釋爲2010年11月10日適用於在其他文化中運行的Excel系統。您可以通過使用'DateTime.Parse'方法來轉換您的字符串,然後將DateTime分配給Excel,從而保持.NET內的轉換。您還可以使用'Range.NumberFormat'方法更改Excel在單元格中顯示日期的方式,例如「MM/DD/YYYY」。 – 2010-10-10 16:42:49