Конвертировать.XLS в табуляцию.TXT

Можно ли каким-то образом преобразовать файл Excel .XLS в файл txt-tsv (tab-separated-values), используя C#?

2 ответа

Решение

Вы можете легко прочитать этот файл XLS через OleDb (поставщик ADO.NET) и создать StreamWriter объект для записи данных в файл Text/TSV.

using (OleDbConnection cn = new OleDbConnection())
        {
            using (OleDbCommand cmd = new OleDbCommand())
            {
                cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"C:\path\file.xls" + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";
                cmd.Connection = cn;
                cmd.CommandText = "select * from [Sheet1$]";
                using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    adp.Fill(dt);
                    using (StreamWriter wr = new StreamWriter(@"C:\path\flie.tsv"))
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            wr.WriteLine(row[0] + "\t" + row[1]);
                        }
                    }
                }
            }
        }

Использование OleDb может быть сложным и может вызвать проблемы в зависимости от версии Excel, на которой была создана электронная таблица. Например, приведенный выше пример будет работать с.xls, но не с.xlsx. Вам необходимо изменить строку подключения с "Microsoft.Jet.OLEDB.4.0" на "Microsoft.ACE.OLEDB.12.0", чтобы компенсировать это. Тем не менее, он все равно не будет универсальным для всех листов Excel. Я бы использовал Microsoft.Office.Interop.Excel следующим образом

Microsoft.Office.Interop.Excel.Application myExcel;
Microsoft.Office.Interop.Excel.Workbook myWorkbook;
Microsoft.Office.Interop.Excel.Worksheet worksheet;

myExcel = new Microsoft.Office.Interop.Excel.Application();
myExcel.Workbooks.Open(inputFileName.xls, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
myWorkbook = myExcel.ActiveWorkbook;
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkbook.Worksheets[1];
myWorkbook.SaveAs(outputFileName.txt, Microsoft.Office.Interop.Excel.XlFileFormat.xlTextWindows, Missing.Value, Missing.Value, Missing.Value, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

myWorkbook.Close(false, Missing.Value, Missing.Value);
myExcel.Quit();

Нет циклов, нет бс. Просто скопируйте, вставьте и измените ваши имена файлов. Единственная проблема, с которой я столкнулся, это то, что myExcel.Quit() иногда работает неправильно и экземпляры Excel остаются открытыми в фоновом режиме. Обходной путь - это убить процесс вручную вашей программой, но я оставлю это для другого обсуждения.

See this answer to a related question here. On the line that has ws.SaveAs(targetFilePath, XlFileFormat.xlCSV);, replace xlCSV with xlUnicodeText.

Другие вопросы по тегам