Tesco 发表于 2014-5-16 18:44:00

回复 20楼iceman的帖子

你好像还是没有明白我的意思
我换一种说法吧
我现在需要的控件需要完成如下功能:
1. 可以嵌入到WinForm中
2. 可以编辑具有格式的文本,可以插入图片等
3. 编辑的内容可以存入数据库
4. 编辑的内容底层格式是否与Microsoft Word兼容,或者可以通过转换兼容(前提是编辑的格式还保留)
前三种要求应该都是能达到的。对于第四个要求,是我疑问所在。
之所以产生上面的需求是这样的:
我需要通过操作微软提供的Word文档模型自动生成Word文档,文档都具有模板,我只需要用户填写部分内容,然后把这些内容收集,在生成最终文档的时候插入到模板中,那么一个符合要求的文档就自动生成了。
问题是我如何提供给用户编辑操作的界面(1到3点)。如果提供了这样的界面后,我收集到的内容(数据库中)又如何从数据库中插入到当前的文档模板中?(第四点)

操作过程是:
用户操作Tx Control生成内容 =》 内容保存到数据库 =》 读出数据库内容生成Word文档

具体的例子就是,我现在数据库中有TX Control所保存的数据了(比如有3段内容吧),也有文档模板了(一个.docx的文档),我怎么把数据库中的内容查到这个word文档的指定位置?



去年我就有这样的疑问,后来你没及时回答后,我就使用了其他解决方案:
我自己另外创建一个Word程序进程,将真实的word程序窗口作为一个子窗口嵌入到WinForm中(使用Windows API设置父窗口),用户直接在这个窗口中操作word,最后我将这些操作的内容保存,供生成文档时使用。但是使用了大半年后发现这样的实现有一些不稳定,而且速度也很慢,占用资源太多,所以又回来问问之前还未关闭的问题。

iceman 发表于 2014-5-20 15:07:00

回复 21楼Tesco的帖子

Tesco 你好,
非常感谢你的详细描述,之前没能持续跟踪你的问题非常抱歉。
我有几个信息需要和你确认。
1.“我需要通过操作微软提供的Word文档模型自动生成Word文档,文档都具有模板”,是否是类似于截图中的模板,只需要用户填写红色框中的内容:


2.“然后把这些内容收集”收集的话是保存全部文档到数据库,还是用户填写部分?

3.“问题是我如何提供给用户编辑操作的界面(1到3点)。如果提供了这样的界面后,我收集到的内容(数据库中)又如何从数据库中插入到当前的文档模板中?(第四点)”
如果只保存用户填写部分,那么可以通过MERGEFIELD来实现,我这里有一个 Demo 你先参考:



欢迎继续交流~

Tesco 发表于 2014-5-20 19:48:00

版主,你好
1. 确实是这样的模板,程序最后要生成的就是这样的一个文档。文档中缺少具体的姓名,年龄等。这些信息(带格式)由用户提供。比如我的模板中有一项叫做:“详细描述”,用户在界面上填写,填写的内容中,可能会有大字体,也许是红色的,又有可能其中还插入了一张表格,又插入了一张图。总之,是Rich Text的。我需要保存这些内容到数据库中,最后在模板中插入的“详细描述”与用户填写时看见的完全一致。
2.是用户填写的部分。
3.如第一点所描述,不只是保存文字信息。需要保存格式图标,表格等等。

你给的例子我看了,完成的功能是使用TXTextControl加载Word文档模板,然后将数据库中的文字信息填入指定部分,最后呈现。
我需要的是:
用TXTextControl填写“详细描述”内容(包含格式)-->保存到数据库-->
用TXTextControl填写“误差描述”内容(包含格式)-->保存到数据库-->
......
将各个部分的内容(即上述详细描述、误差描述等)全部都从数据库中读取出-->分别填写入模板的不同部分,最后生成一份Word文档。

谢谢

iceman 发表于 2014-5-21 21:45:00

回复 23楼Tesco的帖子

用TXTextControl填写“详细描述”内容(包含格式)-->保存到数据库-->
这部分功能可以通过以下步骤实现:
1.选择 MergerField
2.通过 Selection.Save 方法保存到数据库(通过 byte[]):

private void DivideByPage(TXTextControl.PageCollection pc)
      {
            //连接数据库
            string dbconStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + System.IO.Path.Combine(Application.StartupPath, "txdb.mdb");
            OleDbConnection dbcon = new OleDbConnection(dbconStr);

            //初始位置
            int startPOS = 0;
            int endPOS = 0;
            byte[] pageContent;
            for (int i = 1; i <= this.textControl1.Pages; i++)
            {
                startPOS = pc.Start;
                endPOS = pc.Length - 1;

                this.textControl1.Select(startPOS, endPOS);
                this.textControl1.Selection.Save(out pageContent, TXTextControl.BinaryStreamType.WordprocessingML);

                if (dbcon.State == ConnectionState.Closed)
                {
                  dbcon.Open();
                }

                OleDbCommand dbcommand = new OleDbCommand("INSERT INTO txdt(Content) VALUES(@Content)", dbcon);
                dbcommand.Parameters.AddWithValue("@Content", pageContent);
                dbcommand.ExecuteNonQuery();

                dbcon.Close();
            }
      }


通过这段代码应该可以解决了,有什么问题欢迎继续沟通。

Tesco 发表于 2014-5-22 22:10:00

回复 24楼iceman的帖子

把内容保存到数据库并没有什么问题,前半部分的需求解决了,那么后半部分如何解决?(将各个部分的内容(即上述详细描述、误差描述等)全部都从数据库中读取出--&gt;分别填写入模板的不同部分,最后生成一份Word文档。)

iceman 发表于 2014-5-23 10:15:00

回复 25楼Tesco的帖子

22# Demo 即为从数据库中取值填充到模板不同部分,请问您是否查看呢?

Tesco 发表于 2014-5-23 14:52:00

你的demo只是从数据库中读取文本内容,不带任何格式。
如果你还没理解,我建议你再把这个帖子从头开始完整看一下。

iceman 发表于 2014-5-23 18:24:00

回复 27楼Tesco的帖子

其实保存格式这个需求只要在保存时把文字转换为byte[] 即可,在从数据库中取出则带格式了。

我可以为你做一个 Demo ,下周一发送给你。

Tesco 发表于 2014-5-23 18:52:00

回复 28楼iceman的帖子

提醒一下,从数据库获得的byte[]是要填入word文档的,不是txtextcontrol。麻烦了。

Tesco 发表于 2014-5-23 18:55:00

回复 28楼iceman的帖子

如果做demo的话,希望能演示插入word文档的内容是带图片或表格的情况,谢谢
页: 1 2 [3] 4
查看完整版本: 询问功能