Gtk剪贴板电子表格值与公式(Windows)

时间:2016-11-03 20:09:06

标签: gtk

创建了一个Gtk“计算器”,它具有类似电子表格的元素(类似于部分基于GtkSheet / GtkExtra)。除其他外,它能够使用通常的Ctrl-X / C和Ctrl-V来剪切/复制/粘贴其自身内的数据/字符串,还可以使用其他应用程序,例如Excel / OpenOffice等(即方向)使用GtkClipboard元素。

例如,它也可以执行this SO posting中讨论的剪切/复制/过去范围(虽然通过不同的路径,而不是在Python中)。

但是,当Excel,OpenOffice等单元格包含公式(并显示公式的值...例如,单元格中的公式= 1 + 2,显示3)时,通过{将单元格复制到专有的Gtk-Spreadsheet中{1}}仅粘贴/包含“显示值”(不是公式)。

如何让GtkClipboard传递公式?这是否需要一些GtkClipboard规范,是否有必要使用GDKAtomgtk_clipboard_request_text()等,并通过“(Gtk)目标”,或???

P.S。例如,将一个Excel单元格(带有公式)复制到OpenOffice单元格可正常工作,因为OO将包含公式并显示结果(尽管我们无法确定公式是否包含在OS的剪贴板中,或者是否为OO等人正在做一些额外的事情)。想象_request_content()应该能够做到这一点是不是冒昧......?

更新:自原始帖子(OP)以来,我们已经进行了一些测试,以进一步评估我们的“直觉”,即GtkClipboard或Windows剪贴板或其中的某些组合可能无法通过剪切/复制/粘贴(CCP)直接传递电子表格公式(或“完整”单元格内容)。以下是一些结果:

1)我们试图查看OO,POI等源代码以了解它们是如何做到的,但它太大了。我们试图查看GNumerics源代码,但从我们的角度来看,它使用的编码风格太难了(至少对我们来说)。

2)因此,我们进行了一些额外的测试,看看我们是否至少可以确定依赖OS / GtkClipboard的可能性。在这些测试中,我们还通过clipbrd.exe(Windows剪贴板查看器(WCV))“关注”Windows剪贴板:

a)和以前一样,当CCP从Excel到OO(两个应用程序同时运行)时,一切都会通过。

虽然,WCV只显示显示值,而不是公式或单元格的任何其他属性(例如颜色等)[注意:如果使用图像格式,WCV可以传递某些颜色等,但不显示显式单元格“内容/公式/属性“等]。这对Gtk来说有点担心,因为它意味着传递公式等实际上不是通过(基本操作系统)剪贴板。

b)当反向CCP时,从OO到Excel(两个应用程序都在运行),它不起作用,只传递显示值(没有公式,属性等)。

再次,对(wrt)GtkClipboard可能性有点担心。

c)当从Excel执行复制时,但在启动OO之前,然后关闭Excel,并且在OO启动后粘贴,它不适用于公式等,只有显示值。

再次,有点担心GtkClipboard可能性。

d)跳过一些细节以避免稀释这一点,我们的感觉是(仅)“成功”CCP(从Excel到OO,两者都在运行)以某种方式执行OO访问OfficeClipoard的某种组合(参见赢取剪贴板,Gtk可以访问)和/或使用某些ODBC / OLE或任何与Excel的直接内部连接来实现完整Cell内容的传递。 CCP没有反向工作(即OO - > Excel),或者只有当两者都在运行时,也支持这种争用。

虽然这些测试/结果本身并没有果断地证明OS / GtkClipboard实际上不能用于“完整”细胞/范围内容的CCP,但它们高度暗示了这一点。但是,据我们所知,可能有一些GtkClipboardGtkClipboard等)设置可能允许访问其他(例如Office)剪贴板,但我们找不到任何相关信息。

同样地,知道是否有人在使用Gtk的Unix / Linux环境中成功使用CCP(我们通过Win上的几个不同的MingW设置进行测试,但Win和Office剪贴板)与Linux相比,在Gtk下似乎有些不同。

......因此,我们将非常感谢任何对该主题有实际了解的人,至少要确认Win / GdkAtom战略是否浪费时间,如果没有,任何暗示实施将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,怀疑它,发现(一)回答我们自己的问题:

可以通过GtkClipoard将CCP细胞/范围从Excel转换为GTK实体。

...尽管如此,Gtk方文档几乎不存在,基本上需要大量的反复试验。

...以指数方式混淆事项,关于Win OS剪贴板的文档/讨论以及Excel使用的实际机制(实际上是通过OfficeClipboard,OLEClipboard,iDatatObjects等的各种机制将项目附加到OS剪贴板确实,绝大多数人都记录在案,并造成了极其昂贵的分心。

问题的关键在于Gtk / Gdk"原子","目标"在OP中推测/询问的等等。

一种解决方案(使用CAVEATS):

1)使用gtk_clipboard_request_targets()gtk_clipboard_request_contents()获取"目标"的列表那个"所有者"剪贴板上的CCP>材料可以支持(即转换成)。 gtk_clipboard_request_contents()可以执行此操作,因为{"}目标是#{1}}。

此过程可用于生成可从中选择转换为的目标列表。例如,在使用公式,颜色,网格等复制Excel单元格的测试用例中,"可用目标"列出"所有者" (例如Excel)将支持:

"数据对象"
" BIFF8"
" BIFF5"
" BIFF4"
" BIFF3"
"比夫"
" WK1"
" XML电子表格"
" HTML格式"
" UTF8_STRING"
"的CSV"
"富文本格式"
"嵌入源"
"本机"
" OwnerLink"
"对象描述符"
"链接来源"
"链接源描述符" " LINK"
" ObjectLink"
" Ole私人数据"
"图像/ BMP"

CAVEAT:我们测试了其中一些"目标"从Excel中跟随CCP转换为Gtk,但其中一些产生了#34;空/错误" ' GtkSelectionData'

有些人在不同程度上工作,取决于你"你"实际上想要。例如,Target" UTF8_STRING"只带来了#34;显示文字/值" (例如,Excel端公式为" = 1 + 2",显示为" 3",然后此Target为Gtk提供" 3"。

要证明"完整的辉煌" Cell"对象"可以带入Gtk,Target" XML Spreadsheet"用于CCP的一个单元格,包括Excel中的公式,颜色等,到Gtk,在Gtk里面,它生成了一个带有"值"的变量(Data_Alloc)。的:

gdk_atom_intern("TARGETS")

显然,所有关键信息都传递给了Gtk,然后只需解析数据&#34;到Gtk应用程序所需的任何内容。例如,对于CCP将Excel公式设置为Gtk(而不是&#34;值&#34;),只需解析其底部的第6行GtkClipboardContntReceivedFuncX Data_Alloc = <?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font/> <Interior/> <NumberFormat/> <Protection/> </Style> <Style ss:ID="s25"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <Font ss:FontName="Bauhaus 93" x:Family="Decorative" ss:Size="12"/> <Interior ss:Color="#CCFFFF" ss:Pattern="Solid"/> </Style> </Styles> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1"> <Row ss:Height="18.75"> <Cell ss:StyleID="s25" ss:Formula="=1+2"><Data ss:Type="Number">3</Data></Cell> </Row> </Table> </Worksheet> </Workbook> << GtkClipboardContntReceivedFuncX - Exit

... whoo hoo:)

不幸的是,&#34; XML电子表格&#34;对于所有情况来说可能都不够健壮(例如,似乎CPP难以使用Cell引用,例如&#34; = 1 + B1&#34;给它带来麻烦(参见下面的**注释),以及是Gtk版本,Excel版本等问题)。所以其他一个或另一个&#34;目标&#34;可能是必需的,其中一些相当复杂(例如任何BIFF&#39;)。

**注意:某些目标/转换实际上会创建一个完整的电子表格,该电子表格基于CCP&lt; dd; d。因此,在使用公式发送单个Cell并使用&#34; XML Spreadsheet&#34; Gtk中的目标/转换,&#34;结果&#34;是一个完整的单细胞电子表格&#34; (可以在上面的XML示例中看到)。由于其中许多转换都会转换为&#34; A1&#34;样式单元格引用&#34;(相对)RC&#34;引用,任何依赖于&#34;外部&#34; CCP&Cell的范围/单元格被转换为&#34;整个剪贴板(XML)电子表格&#34;不包括&#34;外部单元格&#34;,然后RC引用引用&#34;没有&#34;,因此它无法正确地转换公式。

...再次,这里有很多事情,很大程度上取决于OS,Excel,Gtk等版本和协议。