MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Пример программы конвертации XLS файла в txt на C#"
Answer 930493
Вот так это можно сделать с помощью OLE DB:
using System; using System.Data; using System.IO; using System.Collections.Generic; using System.Data.OleDb; using System.Text; namespace ConsoleApp1 { class Program { //находит максимальную длину элемента для всех столбцов DataTable static int[] maxlen(DataTable dt) { int[] res = new int[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { res[i] = 0; foreach (DataRow row in dt.Rows) { string s = row[i].ToString(); if (s.Length > res[i]) res[i] = s.Length; } } return res; } //выводит таблицу в текстовый файл static void print(DataTable dt, StreamWriter wr) { int[] len = maxlen(dt); foreach (DataRow row in dt.Rows) { for (int i = 0; i < row.ItemArray.Length; i++) { string s = row[i].ToString().PadLeft(len[i]); wr.Write(s + " | "); } wr.WriteLine(); } } static void Main(string[] args) { string xlspath = "c:\\test\\test.xls"; string txtpath = "c:\\test\\test.txt"; string strConn = string.Empty; string sheetName = string.Empty; var builder = new OleDbConnectionStringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=No;IMEX=1;'"); builder.DataSource = xlspath; strConn = builder.ConnectionString; OleDbConnection conn = new OleDbConnection(strConn); using (conn) { conn.Open(); //получаем список листов DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); FileStream fs = new FileStream(txtpath, FileMode.Create); using (fs) { StreamWriter wr = new StreamWriter(fs, Encoding.UTF8); using (wr) { foreach (DataRow row in dtSchema.Rows) { //выводим имя файла sheetName = row.Field<string>("TABLE_NAME"); wr.WriteLine("* Лист "+ sheetName); wr.WriteLine(); //получаем содержимое листа DataTable tbContainer = new DataTable(); OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}]", sheetName), conn); oda.Fill(tbContainer); //выводим таблицу print(tbContainer, wr); wr.WriteLine(); } } } } Console.Write("OK"); Console.ReadKey(); } } }
Данный пример не требует наличия Excel или какого-то другого ПО на целевой машине, но:
Работает только в Windows (2000+).
Работает только в 32-битных приложениях.
Имеет проблемы с чтением данных в случае, когда один столбец содержит в основном числовые значения + несколько текстовых значений (текстовые могут иногда не прочитаться).
Последняя проблема может быть решена установкой следующих значений в реестре на целевых машинах:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Excel] ImportMixedTypes = Text TypeGuessRows = 0
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.