excel中的System.DBNull to String错误

时间:2013-07-25 14:37:22

标签: c# excel-addins

我有自己的自定义文件类型,类似于.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);
            }
        }
    }

0 个答案:

没有答案