Работа с SQLite и ClosedXml

83
17 июня 2021, 14:10

Мне нужно вытащить все из базы данных в Exel файл, работаю с SQLite and ClosedXml. Работаю по шаблону, заранее созданный шаблон, нужно все вывести. Все что пока сделал, не работает, один раз добавляет и потом Exception Элемент с тем же ключом уже был добавлен. Мой код:

string query = "select * from "+bdName;
        string fileOut = @".\Books\finish.xlsx";
        var template = new XLTemplate(@".\Books\TemplateExel.xlsx");
        if (bdName != null)
        {
            SQLiteCommand command = new SQLiteCommand(query, DB);
            SQLiteDataReader dataReader = command.ExecuteReader();
            if (dataReader.HasRows)
            {
                while (dataReader.Read())
                {
                    var dbCust = new DbTemplate();

                    dbCust.Date = dataReader.GetString(1);
                    dbCust.Name = dataReader.GetString(2);
                    dbCust.NameOperation = dataReader.GetString(3);
                    dbCust.Count = dataReader.GetString(4);
                    //первый вариант
                    template.AddVariable(dbCust);
                    template.Generate();
                    template.SaveAs(fileOut);
                    //второй вариант   
                    //template.AddVariable("Date", data_picker);
                    //template.AddVariable("Name", txt_name.Text);
                    //template.AddVariable("NameOperation", txt_nameOperation);
                    //template.AddVariable("Count", txt_count.Text);
                }
            }
        }
Answer 1

Если взять библиотеку-враппер на ClosedXml отсюда:

Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы

То код будет приблизительно:

string query = "select * from "+bdName;
string fileOut = @".\Books\finish.xlsx";
SQLiteCommand command = new SQLiteCommand(query, DB);
SQLiteDataReader rdr = command.ExecuteReader();
Excel xl = new Excel(); //создаем инстанс
var сolumnNames = ReadColumnNames();
var allRows = ReadAllRows(rdr, ColumnNames.Count() );
xl.AddRow(сolumnNames);
foreach (var row in allRows)
{
    xl.AddRow(row);
}
xl.FileSave(fileOut); //сохраняем файл


public List<string> ReadColumnNames(SQLiteDataReader rdr)
{
    var columns = new List<string>();
    for(int i=0; i < rdr.FieldCount; i++)
        columns.Add( rdr.GetName(i) );
    return columns;
}
public List<string> ReadAllRows(SQLiteDataReader rdr, int columnsNum)
{
    var rez = new List<string[]>();
    while (rdr.Read(rdr, columnsNum)) 
    {
        rez.Add(ReadSingleRow(rdr, columnsNum));
    }
    return rez;
}
public string[] ReadSingleRow(SQLiteDataReader rdr, int columnsNum)
{
    string[] rez = new string[columnsNum]();
    for(int i=0; i<= columnsNum)
    {
        rez[i] = rdr.GetString(0);
    }
    return rez;
}

Код писал в блокноте и не проверял так что могут быть мелкие ошибки.

READ ALSO
C# отправить POST запрос и получить ответ

C# отправить POST запрос и получить ответ

Доброе время суток, я не знаю как отправить ПОСТ запрос, но при этом получить ответ от сервера и вывести на экран (типа MessageBox)Помогите пожалуйста

113
Не меняется bool значение или я не правильно его пытаюсь изменить/прочитать

Не меняется bool значение или я не правильно его пытаюсь изменить/прочитать

хочу, чтобы success менялся на true или false в зависимости от ответа apiКод:

83
MySql запрос (Subquery returns more than 1 row)

MySql запрос (Subquery returns more than 1 row)

Пытаю выполнить вот такой запрос INSERT INTO catalog_product_entity_int(attribute_id, store_id, entity_id, value) VALUES (558, 0, (SELECT cpeentity_id FROM catalog_product_entity cpe LEFT JOIN catalog_product_entity_int cpei ON cpe

74
Сложный SQL запрос из нескольких таблиц [закрыт]

Сложный SQL запрос из нескольких таблиц [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

77