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