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