创建了一个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
规范,是否有必要使用GDKAtom
与gtk_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
可能性。
虽然这些测试/结果本身并没有果断地证明OS / GtkClipboard
实际上不能用于“完整”细胞/范围内容的CCP,但它们高度暗示了这一点。但是,据我们所知,可能有一些GtkClipboard
(GtkClipboard
等)设置可能允许访问其他(例如Office)剪贴板,但我们找不到任何相关信息。
同样地,知道是否有人在使用Gtk的Unix / Linux环境中成功使用CCP(我们通过Win上的几个不同的MingW设置进行测试,但Win和Office剪贴板)与Linux相比,在Gtk下似乎有些不同。
......因此,我们将非常感谢任何对该主题有实际了解的人,至少要确认Win / GdkAtom
战略是否浪费时间,如果没有,任何暗示实施将不胜感激。
答案 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等版本和协议。