小编Bil*_*ill的帖子

将 Word 保存为 UTF-8 编码的 HTML

我正在编写一些 C# VSTO 代码来读取 Microsoft Word 文档并将其保存到过滤的 HTML。当我在通用 Word 文档上执行此功能时,html 文件的输出使用 Windows 字符集,如下所示:

<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
Run Code Online (Sandbox Code Playgroud)

如果我打开一个文档并转到 File->Options->Advanced->Web Options,我可以选择 UTF8,结果过滤后的 html 文档输出如下所示:

<meta http-equiv=Content-Type content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

我想编写 C# 代码,将任何Word 文档保存为使用 utf-8 过滤的 html。在做了一些研究之后,我发现有些人说“SaveAs2”功能不起作用(即使 Microsoft 将其记录为一项功能)。这意味着,此代码对我不起作用:

doc.SaveAs2("C:\\Temp\\Test.htm", MsWord.WdSaveFormat.wdFormatFilteredHTML, Encoding: "65001");
Run Code Online (Sandbox Code Playgroud)

(注意:我尝试将 65001 放在引号中而不使用引号......既不会抛出错误,也不会起作用)。

接下来,我继续为文档设置 Web 选项,如下所示:

doc = app.Documents.Open("C:\\Temp\\Test.docx");
doc.WebOptions.Encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
doc.SaveAs2(destFile, MsWord.WdSaveFormat.wdFormatFilteredHTML);
Run Code Online (Sandbox Code Playgroud)

据我所知,上面的代码执行与我手动打开文件完全相同的功能,转到文件->选项...,设置为 UTF-8 并将文件保存到过滤的 html,但输出仍然看起来像这个:

<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
Run Code Online (Sandbox Code Playgroud)

有没有办法强制 Microsoft Word 将文件输出为 UTF-8,而无需先手动配置文档?

c# encoding vsto ms-word utf-8

4
推荐指数
1
解决办法
6863
查看次数

正则表达式以防止尾随空格和额外空格

现在我有一个正则表达式可以防止用户输入任何特殊字符。唯一允许的字符是 A 到 Z、0 到 9 或空格。

我想改进这个正则表达式以防止以下情况:

  1. 没有前导/训练空格 - 如果用户在条目之前或之后键入一个或多个空格,则不允许。
  2. 没有双空格 - 如果用户多次键入空格键,则不允许。

我现在用来防止特殊字符的正则表达式如下所示,看起来工作得很好,即:

^[a-zA-Z0-9 ]+$
Run Code Online (Sandbox Code Playgroud)

按照其他一些想法,我尝试了所有这些选项,但它们不起作用:

^\A\s+[a-zA-Z0-9 ]+$\A\s+
/s*^[a-zA-Z0-9 ]+$/s*
Run Code Online (Sandbox Code Playgroud)

我可以帮我处理这段代码吗?同样,我只想要字母 AZ、数字 0-9,并且没有前导或尾随空格。

谢谢。

regex

3
推荐指数
1
解决办法
4061
查看次数

COM加载项:解决WinWord.exe中的错误DisconnectedContext

我构建了一个Microsoft Word的附加组件.当用户单击某个按钮时,它会运行许多将Microsoft Word文档列表导出为Filtered HTML的进程.这很好用.

代码落后的地方是处理大量文件.文件转换完成后我调用下一个函数,应用程序崩溃,我从Visual Studio获取此信息:

托管调试助手'DisconnectedContext'在'C:\ Program Files\Microsoft Office\root\Office16\WINWORD.EXE'中检测到问题.

附加信息:此RuntimeCallableWrapper转换到COM上下文0x56255b88失败,并显示以下错误:系统调用失败.(来自HRESULT的异常:0x80010100(RPC_E_SYS_CALL_FAILED)).这通常是因为创建此RuntimeCallableWrapper的COM上下文0x56255b88已断开连接或正忙于执行其他操作.从当前COM上下文释放接口(COM上下文0x56255cb0).这可能会导致损坏或数据丢失.要避免此问题,请确保所有COM上下文/公寓/线程都保持活动状态并可用于上下文转换,直到应用程序完全使用表示其中的COM组件的RuntimeCallableWrappers完成.

经过一些测试,我意识到如果我只是在文件转换后删除所有代码,就没有问题.要解决此问题,我将其余代码放在另一个按钮中.

问题是我不想给用户两个按钮.阅读各种其他线程后,听起来我的代码有内存或线程问题.我正在阅读的答案并没有帮助我真正理解下一步该做什么.

我觉得这就是我想要做的事情:

1-运行转换.2-转换中关闭线程/清理内存问题.3-继续运行代码.

不幸的是,我真的不知道怎么做#2或者甚至可能.非常感激您的帮忙.

c# com multithreading visual-studio

3
推荐指数
1
解决办法
715
查看次数

如何将Winform文本框绑定到类属性?

我已经阅读了关于Stack Overflow和其他地方的许多问题,这些问题描述了如何将文本框绑定到类,但是在编译时如果没有收到VS的错误,我似乎甚至无法使基础工作。

(1)我要完成的是显示一个类的属性的文本。

(2)当用户修改该文本时,我希望该属性自动更新。

不幸的是,我什至无法超越(1)。

班级:

class BookProperties : INotifyPropertyChanged
{

    private string _bookTitle;
    public string bookTitle { get { return _bookTitle; } set { SetField(ref _bookTitle, value, "bookTitle"); } }

    #region handle property changes

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    #endregion …
Run Code Online (Sandbox Code Playgroud)

c# winforms 2-way-object-databinding

2
推荐指数
1
解决办法
5822
查看次数

在Objective C中使用发布的最佳实践

我正在上课(在Lynda.com上进行基于计算机的培训),教师继续讲述如何使用"发布"来处理对象.本课程创建于2011年,显然Apple已更新其产品,以便自动为您完成发布.虽然我知道我可以回到手动模式并自行发布项目(例如关闭ARC),我的问题是:最佳做法是什么?我应该打开ARC还是关掉它?也许你有一个很好的例子,我应该何时做出这个选择?

此外,如果我完全不在此基础上,您的帮助也会受到赞赏:-)

谢谢.

memory-management objective-c ios automatic-ref-counting

1
推荐指数
1
解决办法
119
查看次数