【问题标题】:Gtk clipboard spreadsheet value vs formula (Windows)Gtk剪贴板电子表格值与公式(Windows)
【发布时间】:2016-11-13 02:13:07
【问题描述】:

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

例如,它还可以执行 this SO posting 中讨论的范围的剪切/复制/过去(尽管通过不同的路线,这在 Python 中没有)。

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

如何让GtkClipboard 改为传递公式?这是否需要一些GDKAtom 规范,是否有必要使用gtk_clipboard_request_text()_request_content() 等并通过“(Gtk)目标”工作,或者???

附:例如,将 Excel 单元格(带有公式)复制到 OpenOffice 单元格中可以正常工作,在该 OO 中将包含公式并显示结果(尽管我们无法确定该公式是否包含在操作系统的剪贴板中,或者是否 OO等人正在做一些额外的事情)。想象GtkClipboard 也应该能够做到这一点是不是很冒昧……?


更新:自原始帖子 (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 的某种组合执行(参见Win 剪贴板,Gtk 可以访问)和/或使用一些 ODBC/OLE 或任何与 Excel 的直接内部连接来影响完整单元格内容的传递。 CCP 不能反向工作(即 OO -> Excel),或仅当两者都运行时,也支持这种争用。

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

同样,了解是否有人在使用 Gtk 的 Unix/Linux 环境中成功通过 CCP 处理这类事情会很有用(我们正在 Win 上通过几个不同的 MingW 设置进行测试,但 Win 和 Office 剪贴板在 Gtk 下和 Linux 下似乎有一些不同)。

...因此,我们将感谢任何对该主题有实际了解的人至少确认 Win/GtkClipboard 策略是否浪费时间,如果不是,任何实施提示都会不胜感激。

【问题讨论】:

    标签: gtk


    【解决方案1】:

    好的,怀疑它,找到(一个)我们自己问题的答案:

    可以通过GtkClipoard 将 Excel 中的 CCP 单元格/范围设置为 GTK 实体。

    ...话虽如此,Gtk 方面的文档几乎不存在,而且基本上需要大量的试验和错误。

    ... 以指数方式混淆问题,有关 Win OS 剪贴板的文档/讨论,以及 Excel 使用的实际机制(实际上是通过 OfficeClipboard、OLEClipboard、iDatatObjects 等的各种机制将项目附加到 OS 剪贴板.) 确实,被大量记录在案并造成非常昂贵的干扰。

    问题的全部关键确实在于 OP 中推测/询问的 Gtk/Gdk“原子”、“目标”等。

    一种解决方案(带有 CAVEATS):

    1) 使用gtk_clipboard_request_targets()gtk_clipboard_request_contents() 获取剪贴板上CCP 材料的“所有者”可以支持(即转换为)的“目标”列表。 gtk_clipboard_request_contents() 可以做到这一点,因为它被指定为 gdk_atom_intern("TARGETS") 作为它的“目标”。

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

    “数据对象”
    “Biff8”
    “Biff5”
    “Biff4”
    “Biff3”
    “比夫”
    “Wk1”
    “XML 电子表格”
    “HTML 格式”
    “UTF8_STRING”
    “CSV”
    “富文本格式”
    “嵌入源”
    “原生”
    “所有者链接”
    “对象描述符”
    “链接源”
    “链接源描述符” “链接”
    “对象链接”
    “Ole 私人数据”
    “图像/bmp”

    CAVEAT:我们在 Gtk 中按照 Excel 中的 CCP 测试了一些转换“目标”,但其中一些产生了“空/错误”“GtkSelectionData”。

    有些工作的程度不同,这取决于“你”真正想要什么。例如,Target "UTF8_STRING" 只带了 "display text/value"(例如 Excel 端的公式是 "=1+2",显示为 "3",那么这个 Target 为 Gtk 提供了 "3"。

    为了证明可以将单元格“对象”的“完整功能”带入 Gtk,目标“XML 电子表格”用于将带有公式、颜色等的单元格从 Excel、Gtk 和 Gtk 内部 CCP它产生了一个变量(Data_Alloc),其“值”为:

    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
    

    显然,所有关键信息都传递到 Gtk 中,然后只需将“数据”解析为 Gtk 应用程序中所需的任何内容。例如,要将 Excel 公式 CCP 转换为 Gtk(而不是“值”),只需解析从底部算起的第 6 行 Formula = "=1+2"

    ...哇哦:)

    不幸的是,“XML 电子表格”可能对所有情况都不够健壮(例如,使用单元格引用(例如“= 1+B1”)似乎很难对任何内容进行 CPP 处理(请参阅下面的**注释),并且可能是 Gtk 版本、Excel 版本等问题)。因此,可能需要其他“目标”中的一个或另一个,其中一些相当复杂(例如任何 BIFF)。

    ** 注意:某些目标/转换实际上会根据 CCP'd 的单元格/范围创建整个电子表格。因此,在发送带有公式的单个单元格并在 Gtk 中使用“XML 电子表格”目标/转换的情况下,“结果”是“整个单个单元格电子表格”(如上面的 XML 示例所示) .由于这些转换中的许多转换将“A1”样式单元格引用转换为“(相对)RC”引用,因此位于被 CCP 处理并转换为“整个剪贴板 (XML) 电子表格”的范围/单元格“外部”的任何依赖项将不包括“外部单元格”,然后 RC 引用引用“无”,因此它无法正确/根本转换公式。

    ...再次,这里发生了很多事情,很大程度上取决于操作系统、Excel、Gtk 等版本和协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2017-05-30
      • 2012-12-01
      • 1970-01-01
      • 2013-02-01
      相关资源
      最近更新 更多