1

我有我自己的自定义文件类型,类似于 .CSV,除了自定义分隔符。逗号的分隔符是(char)20(看起来像一个正方形),而引号的分隔符是(char)254(看起来像 þ)。我在 Visual Studio 中创建了一个 Excel 2010 加载项,以解析将所有自定义分隔符替换为逗号和双引号的文档,使其为 .CSV 格式。

该程序还创建了一个新的工具栏和按钮来启动该过程。它适用于某些文档,但不适用于其他文档,如果您尝试在一个 Excel 实例中执行两次,则会出现错误"Cannot implicitly convert type 'System.DBNull' to 'string'"。这是因为该row.Text属性被读取为{}.

现在我的问题是是什么导致该row.Text属性被读取为{}而不是单元格内的文本?另外,即使它们使用相同的编码,为什么在某些文档上会发生这种情况,而在其他文档上却不会发生这种情况?

单元格中的内容的一个示例是(注意 - 逗号符号不会在此处打印):

þITEM_IDþþBEGDOCþþENDDOCþþBEGATTþþENDATTþþPARENT_ATTACHMENTþþATTACHMENT_BATESþþ etc.

编辑这是我的代码:

    public partial class ThisAddIn
{
    Office.CommandBarButton toolbarCommand;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Office.CommandBar toolbar = Application.CommandBars.Add("My Toolbar",Office.MsoBarPosition.msoBarTop,false,true);
        toolbarCommand = (Office.CommandBarButton)
        toolbar.Controls.Add(
           Office.MsoControlType.msoControlButton,
           missing,
           missing,
           missing,
           true);
        toolbarCommand.Caption = "Toolbar Button";
        toolbarCommand.FaceId = 59;
        toolbarCommand.Click += new Office._CommandBarButtonEvents_ClickEventHandler(toolbarCommand_Click);
        toolbar.Visible = true;
    }



    void toolbarCommand_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
    {
        Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);
        try
        {
            IterateRows(activeWorksheet);
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        Ctrl.Click+=new Office._CommandBarButtonEvents_ClickEventHandler(toolbarCommand_Click);
    }

    public void IterateRows(Excel.Worksheet worksheet)
    {
        //Get the used Range
        Excel.Range usedRange = worksheet.UsedRange;

        Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);

        //Iterate the rows in the used range

        if (usedRange.Rows.Count > 1)
        {
            foreach (Excel.Range row in usedRange.Rows)
            {
                //MessageBox.Show(row.Text);
                char quote = (char)254;
                string data = row.Text;
                row.Columns[1] = data.Replace(quote, '"').Replace((char)20, ',');
                row.TextToColumns(Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, Type.Missing, Type.Missing, Type.Missing, true);
            }
        }
    }
4

0 回答 0