SukirtiShetty Ответов: 1

Преобразование excel в текстовый формат с помощью разделителей


Привет
Мне нужно преобразовать Excel в текстовый формат с помощью разделителей.
Я кодировал с помощью Interop. Но для этого нужно всего 254 колонки. Я использую формат Excel 2007 года.
У меня есть 400 столбцов в Excel. Oledb занимает всего 254 столбца при чтении Excel

Пожалуйста, кто-нибудь помогите мне, как конвертировать Excel в текст

Что я уже пробовал:

tring excelConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=No;IMEX=1;';";
                        OleDbConnection excelConn = new OleDbConnection(excelConnStr);
                        excelConn.Open();
                        DataTable dbSchema = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        string strsheetName = "Sheet1$";
                        if (dbSchema != null && dbSchema.Rows.Count > 0)
                        {
                            strsheetName = Convert.ToString(dbSchema.Rows[0]["TABLE_NAME"]);
                        }




                        System.Data.DataTable dtPatterns = new System.Data.DataTable();
                      excelCommand = new OleDbComnd("SELECT * FROM [" + strsheetName + " ]", excelConn);
                        
        
                        excelDataAdapter.Fill(dtPatterns);
                       
                        List<string> xcelData = new List<string>();
                        List<string> ColumnNames = new List<string>();
                        ds.Tables.Add(dtPatterns);
                        totalRowsCount = dtPatterns.Rows.Count;
                        totalColumnsCount = dtPatterns.Columns.Count;

                        this.lblRowsCount.Invoke((MethodInvoker)delegate { this.lblRowsCount.Text = totalRowsCount.ToString(); });
                       
                        for (int c = 0; c < dtPatterns.Columns.Count; c++)
                        {
                            if (c == dtPatterns.Columns.Count - 1)
                            {
                                SB1.Append(cValue.ToString() + dtPatterns.Columns[c].ToString() + cValue.ToString());
                            }
                            else
                            {
                                SB1.Append(cValue.ToString() + dtPatterns.Columns[c].ToString() + cValue.ToString() + sValue.ToString());
                            }
                        }
                        SB1.Append("\r\n");
                        for (int d = 0; d < dtPatterns.Rows.Count; d++)
                        {
                            this.toolStripStatusLabel1.Text = string.Format("Processing Please Wait ...{0} of {1}", (count + 1), totalRowsCount);
                            for (int c = 0; c < dtPatterns.Columns.Count; c++)
                            {
                                int g = dtPatterns.Columns.Count - 1;
                                if (c == g)
                                {
                                    SB1.Append(cValue.ToString() + dtPatterns.Rows[d][c].ToString() + cValue.ToString());
                                }
                                else
                                {
                                    SB1.Append(cValue.ToString() + dtPatterns.Rows[d][c].ToString() + cValue.ToString() + sValue.ToString());
                                }
                            }
                            SB1.Append("\r\n");
                            count++;
                        }

1 Ответов

Рейтинг:
11

OriginalGriff

Это ограничение поставщика для листа - смотрите здесь: Импорт данных из файла Excel в dataTable: ограничение столбца?[^]

Цитата:
Да, я пытался объединить два набора данных, но это слияние не в виде столбцов.

Метод Merge не добавляет столбцы: он добавляет строки таблицы вместе, где схема таблицы одинакова. Это не относится к вам: вам нужно добавить столбцы.
Попробовать это:
public static DataTable MergeTables(DataTable t1, DataTable t2)
    {
    // Build combined table columns
    DataTable merged = t1.Clone();                  // Include all columns from t1 in result.
    foreach (DataColumn col in t2.Columns)
        {
        string newColumnName = col.ColumnName;
        merged.Columns.Add(newColumnName, col.DataType);
        }
    // Add all rows from both tables
    var mergedRows = t1.AsEnumerable().Zip(t2.AsEnumerable(), (r1, r2) => r1.ItemArray.Concat(r2.ItemArray).ToArray());
    foreach (object[] rowFields in mergedRows)
        {
        merged.Rows.Add(rowFields);
        }
    return merged;
    }
Это довольно очевидно, как использовать его:
DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof(int));
dt1.Columns.Add("Name", typeof(string));
dt1.Rows.Add(1, "Mike");
dt1.Rows.Add(2, "Susan");
var dt2 = new DataTable();
dt2.Columns.Add("Country", typeof(string));
dt2.Rows.Add("UK");
dt2.Rows.Add("France");

DataTable dtMerged = MergeTables(dt1, dt2);


SukirtiShetty

Да, я пытался объединить два набора данных, но это слияние не в виде столбцов.

Например:
МОЙ DS1:
1 2
3 4

DS2 у:
5 6
7 8

Я хочу получить результат, как показано ниже
1 2 5 6
3 4 7 8


Но я получаю
1 2
3 4
5 6
7 8

OriginalGriff

И откуда мне знать, как ты пытался их объединить? Я не могу видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли!

SukirtiShetty

Системы.Данных.Объект DataTable dtPatterns = новая система.Данных.Объект DataTable();

excelCommand = new OleDbCommand("SELECT * FROM [Sheet1$A:Z]", excelConn);
excelDataAdapter.Команды selectcommand = excelCommand;
excelDataAdapter.Заливка(dtPatterns);

Список<строка> У xcelData = новый список<строка&ГТ;();
List<string> ColumnNames = новый список<string>();
ДС.столы.Добавить(dtPatterns);



Системы.Данных.Объект DataTable dtPatterns1 = новая система.Данных.Объект DataTable();

excelCommand = new OleDbCommand("SELECT * FROM [Sheet1$AA:KZ]", excelConn);
excelDataAdapter.Команды selectcommand = excelCommand;
excelDataAdapter.Заполнение(dtPatterns1);

List<string> xcelData1 = новый список<string>();
List<string> ColumnNames1 = новый список<string>();
ds1.таблицы.Добавить(dtPatterns1);
dtPatterns.Слияние(dtPatterns1);

OriginalGriff

Ответ обновлен.

SukirtiShetty

Спасибо, сэр, но не могли бы вы указать, как передать объединенные значения в string builder(текстовый файл с использованием разделителей)

Ранее я использовал код, как показано ниже

totalRowsCount = dtPatterns.Rows.Рассчитывать;
totalColumnsCount = dtPatterns.Столбцы.Рассчитывать;

это.lblRowsCount.Invoke((MethodInvoker)delegate { this.lblRowsCount.Text = totalRowsCount.Метод toString(); });

для (int c = 0; c < dtPatterns.Столбцы.Count; c++)
{
if (c == dtPatterns.Столбцы.Количество - 1)
{
SB1.Append(cValue.ToString() + dtPatterns.Колонки[с].ToString() + cValue.Метод toString());
}
еще
{
SB1.Append(cValue.ToString() + dtPatterns.Колонки[с].ToString() + cValue.ToString() + sValue.Метод toString());
}
}
SB1.Append("\r\n");
for (int d = 0; d < dtPatterns.Rows.Граф; d++)
{
this.toolStripStatusLabel1.Текстовая строка.Формат("Обработка, Пожалуйста, Подождите ...{0} of {1}", (count + 1), totalRowsCount);
для (int c = 0; c < dtPatterns.Столбцы.Count; c++)
{
int g = dtPatterns.Столбцы.Количество - 1;
если (c == g)
{
SB1.Append(cValue.ToString() + dtPatterns.Строки[d][c].ToString() + cValue.Метод toString());
}
еще
{
SB1.Append(cValue.ToString() + dtPatterns.Строки[d][c].ToString() + cValue.ToString() + sValue.Метод toString());
}
}
SB1.Append("\r\n");
считать++;
}

OriginalGriff

И что же?
Что он делает такого, чего вы не ожидали, или не делает того, что вы сделали?

И почему это выглядит так, как будто вы сами конвертируете DataTable в CSV-данные? Почему бы не использовать один из многих доступных примеров кода?
https://www.google.co.uk/search-что?q=datatable+to+CSV+c%23&oq=datatable+to+CSV+c%23&aqs=chrome..69i57j0l5.6624j0j7&sourceid=chrome&ie=UTF-8

SukirtiShetty

Спасибо это сработало для меня

OriginalGriff

Всегда пожалуйста!