无法使用Excel interop正常工作导入CSV(不拆分数据)

时间:2012-03-20 22:14:46

标签: c# csv office-interop excel-interop

我在看这里建议的解决方案: C# Excel Interop: Opening and Showing CSV file

excel.Workbooks.OpenText(filename, 
                         DataType: Excel.XlTextParsingType.xlDelimited, 
                         TextQualifier: Excel.XlTextQualifier.xlTextQualifierNone,
                         ConsecutiveDelimiter: true,
                         Semicolon: true);

此代码打开CSV文件,但不分割分号上的数据。

如果我在Excel中手动打开文件并使用此处指定的相同选项,它可以正常工作,所以我必须遗漏一些东西。

有什么建议吗?

更新:部分CSV

> Betalings Enveloppe;;;;Dossier;ACME ;;;;Dagboek;;F4 - AAA
> 46846846-;;; ;;;;Rekening;54654684684684;;;;BIC;;null;;; ;;;;Betaal
> datum;Fri Mar 16 00:00:00 CET 2012;;;;EnveloppeId;;0002;;;
> Document;;Datum;Rekeningnummer;;;;BIC;Referentie;;Leverancier;;;Bedrag;
> 2012/A1/268;;29/02/2012;BE94684684684128;;;;BBRUBEBB;BLUB ;;DOKTER WHO
> ;;;28.0 ?;

2 个答案:

答案 0 :(得分:1)

我认为扩展是你的问题。我尝试使用CSV和TXT扩展的以下代码,它作为TXT工作,但不作为CSV。

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
public class ExcelInteropTest
{
    //private static Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    public static void Parse(String filename)
    {
        var _app = new Excel.Application();
        var _workbooks = _app.Workbooks;

        _workbooks.OpenText(filename,
                                 DataType: Excel.XlTextParsingType.xlDelimited,
                                 TextQualifier: Excel.XlTextQualifier.xlTextQualifierNone,
                                 ConsecutiveDelimiter: true,
                                 Semicolon: true);

        Excel.Sheets sheets = _workbooks[1].Worksheets;
        Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_Item(1);

        List<String[]> excelData = new List<string[]>();
        for (int i = 1; i <= 6; i++)
        {
            Excel.Range range = worksheet.get_Range("A" + i.ToString(), "Z" + i.ToString());
            System.Array myvalues = (System.Array)range.Cells.Value;
            string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
            excelData.Add(strArray);
        }

        foreach (var item in excelData)
        {
            Console.WriteLine(String.Join("|",item));
        }

    }

}

我所做的只是为每一行创建一个字符串数组并将其添加到列表中,然后我只写了每个数组(在管道'|'上连接,看起来它在TXT是扩展时正确地拆分了所有内容。我猜想excel中特殊的CSV文件可能会导致问题

答案 1 :(得分:0)

我不知道您是否错误复制了该代码,但拼写了 DateType:而不是 DataType:

要进行任何分隔,DataType必须正确。 (http://msdn.microsoft.com/en-us/library/ff837097.aspx

我经常做的另一件事就是帮助过去的excel互操作挑战是在使用gui做某事时记录一个宏(就像你说的那样,在excel中手动打开文件......)并查看宏代码(在VB中,但是应该是相似的)看起来像。