Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Aumi
18 / 30 / 14
Регистрация: 08.10.2015
Сообщений: 399
Завершенные тесты: 2
1

Выгрузить в Excel данные еще раз

29.01.2018, 10:31. Просмотров 343. Ответов 3
Метки нет (Все метки)

Добрый день!

Я выгружаю данные из sql server в excel. Все проходит без проблем, но если нажать второй раз на кнопку, то выскакивает ошибка. Подскажите, в чем проблема, ведь ресурсы освобождаются (или нет?)

Окна появляются друг за другом, а потом пустой эксель без имени, которое должно быть

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 public void CreateExcel()
 {
       string Stime = DateTime.Now.ToString("dd.MM.yyyy HH mm ss");  //в имени фигурирует дата и время
           string file = textBox2.Text + @"\готовый " + Stime + ".xlsx";
 
            Excel1.Application xlApp = new Excel1.Application();
            Microsoft.Office.Interop.Excel.Range xlSheetRange;
            Excel1.Worksheet xlSheet = new Excel1.Worksheet();
            Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
 
 
  try
            {
                //добавляем книгу
                ObjWorkBook = xlApp.Workbooks.Add(Type.Missing);
 
 
                //делаем временно неактивным документ
                xlApp.Interactive = false;
                xlApp.EnableEvents = false;
 
                //выбираем лист на котором будем работать (Лист 1)
                xlSheet = (Excel1.Worksheet)xlApp.Sheets[1];
                //Название листа
                xlSheet.Name = "Лист1";
 
                //Выгрузка данных
                DataTable dt = export.GetData();
 
                int collInd = 0;
                int rowInd = 0;
                string data = "";
 
                //называем колонки
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    data = dt.Columns[i].ColumnName.ToString();
                    xlSheet.Cells[1, i + 1] = data;
 
                    //выделяем первую строку
                    xlSheetRange = xlSheet.get_Range("A1:Z1", Type.Missing);
 
                    //делаем полужирный текст и перенос слов
                    xlSheetRange.WrapText = true;
                    xlSheetRange.Font.Bold = true;
                }
 
 
 
                int RowsCount = dt.Rows.Count;
                int ColumnsCount = dt.Columns.Count;
                object[,] arrData = new object[RowsCount, ColumnsCount];
 
                for (int j = 0; j < RowsCount; j++)
                    for (int i = 0; i < ColumnsCount; i++)
                        arrData[j, i] = dt.Rows[j][i];
 
                //выгрузка данных на лист Excel
                xlSheet.Range["A2"].Resize[arrData.GetUpperBound(0) + 1, arrData.GetUpperBound(1) + 1].Value = arrData; //250 строка-это следующая пустая без кода. То скорее всего ругается на эту
 
                //выбираем всю область данных
                xlSheetRange = xlSheet.UsedRange;
 
                //выравниваем строки и колонки по их содержимому
                xlSheetRange.Columns.AutoFit();
                xlSheetRange.Rows.AutoFit();
 
                ObjWorkBook.SaveAs(file);
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                //Показываем ексель
                xlApp.Visible = true;
 
                xlApp.Interactive = true;
                xlApp.ScreenUpdating = true;
                xlApp.UserControl = true;
 
 
                //Отсоединяемся от Excel 
                export.releaseObject(xlSheet);
                export.releaseObject(xlApp);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SqlConnection con = new SqlConnection("Data Source ="+ NameServer() + "; Initial Catalog = Vedomost; Integrated Security = True");
 
        public DataTable GetData()  
        {
            DataTable dt = new DataTable();
            try
            {
 
                SqlCommand comm = new SqlCommand("SelectAll", con);  //выбирает нужные столбцы из нужной таблицы  
                comm.CommandType = CommandType.StoredProcedure;
 
                con.Open();
                comm.ExecuteNonQuery();
                SqlDataAdapter da = new SqlDataAdapter(comm);
                DataSet ds = new DataSet();
                da.Fill(ds);
                dt = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                con.Close();
                con.Dispose();
            }
            return dt;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  //Освобождаем ресуры (закрываем Excel)
        public void  releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show(ex.ToString(), "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                GC.Collect();
            }
        }
0
Миниатюры
Выгрузить в Excel данные еще раз   Выгрузить в Excel данные еще раз  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2018, 10:31
Ответы с готовыми решениями:

Выгрузить данные из html таблицы в в Excel
Здравствуйте. Есть файл в нем данные находятся в таблице &lt;table&gt; данные ,как мне из выгрузить в...

Выгрузить данные в csv
Добрый день,я ток начал изучать C# но стоит задача, есть объём данных, который из проги надо...

Выгрузить данные из сайта в файл
Добрый день, ребята. Подскажите пожалуйста учебники или ресурсы для следующего. Нужно обратиться к...

Как выгрузить из процессов Excel по окончанию работы с книгой
Добрый день. Помогите, пожалуйста, разобраться. Выполняю следующие действия: загружаю в...

Еще раз про цветы)
У меня есть 2Д массив данных (нек-рое изображение в цифирях от 0 до Х), как из него сделать ч/б...

3
Aumi
18 / 30 / 14
Регистрация: 08.10.2015
Сообщений: 399
Завершенные тесты: 2
29.01.2018, 10:50  [ТС] 2
Если есть другие технологии в коде, чтобы быстро выгружать данные в эксель без проблем (100т строк), то рада буду о них узнать
0
Kill100
421 / 287 / 81
Регистрация: 11.12.2010
Сообщений: 1,208
Завершенные тесты: 1
29.01.2018, 11:03 3
Рекомендую посмотреть в строну EPPlus Относительно удобно, и стабильно. но правда раньше работало только для 2007 xlsx и выше формата (который xml).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    public byte[] GetXlsxData(DataTable table)
        {
            using (var p = new ExcelPackage())
            {
                using (var ws = p.Workbook.Worksheets.Add("Sheet1"))
                {
                    for (var i = 1; i <= table.Columns.Count; i++)
                        ws.Cells[1, i].Value = table.Columns[i - 1].Caption;
                    ws.OutLineApplyStyle = true;
 
                    var dataView = table.DefaultView;
                    if (dataView.Count > 0)
                    {
                        for (var column = 1; column <= table.Columns.Count; column++)
                            for (var row = 1; row <= dataView.Count; row++)
                            {
                                var item = dataView[row - 1][column - 1];
                                if (item is decimal)
                                {
                                    ws.Cells[row + 1, column].Value = PropertyValue(item);
                                    ws.Cells[row + 1, column].Style.Numberformat.Format = "# ##0.00";
                                }
                                if (item is int || item is long || item is short)
                                {
                                    ws.Cells[row + 1, column].Value = PropertyValue(item).ToString();
                                    ws.Cells[row + 1, column].Style.Numberformat.Format = "0";
                                }
                                else
                                {
                                    ws.Cells[row + 1, column].Value = PropertyValue(item);
                                }
                            }
                    }
 
                    for (var i = 1; i <= table.Columns.Count; i++)
                        ws.Column(i).AutoFit();
 
                    return p.GetAsByteArray();
                }
            }
        }
PS: exel есть ограничение на 1 048 576 строк, на одной странице.
1
Aumi
18 / 30 / 14
Регистрация: 08.10.2015
Сообщений: 399
Завершенные тесты: 2
29.01.2018, 11:41  [ТС] 4
Читала про EPPlus вышла на ClosedXml. Код проще, работает также быстро. Если кому понадобиться вот ниже код. Позволяет несколько раз записывать

using ClosedXML.Excel;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 string connectionstring;
 
            connectionstring = "Data Source = "+ NameServer() + "; Initial Catalog = Vedomost; Integrated Security = True";
 
            string Stime = DateTime.Now.ToString("dd.MM.yyyy HH mm ss");
 
            SqlConnection connection = new SqlConnection(connectionstring);
            connection.Open();
 
            SqlCommand command = new SqlCommand("SelectAll", connection);
            command.CommandType = CommandType.StoredProcedure;
 
            DataTable data = new DataTable();
 
            using (SqlDataAdapter a = new SqlDataAdapter(command))
            {
                a.Fill(data);
                using (XLWorkbook wb = new XLWorkbook())
                {
                    wb.Worksheets.Add(data, "Excel Export");
                    string file = textBox2.Text + @"\итоговый " + Stime + ".xlsx";
 
                    wb.SaveAs(file);
 
                   
                }
            }
0
29.01.2018, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2018, 11:41

Еще раз о перегрузке оператора ++
Привет. Прочитал аналогичные темы на форуме. И все равно не получается: Реализую перегрузку...

С#/Структуры вложенные/Marshal еще раз объясните?
Здравствуйте. Код примерно такой: ... public unsafe struct def_ { ...

Определите, встречается ли первое слово еще раз
Здравствуйте, нужно считать текст с .doc файла,чтобы узнать сколько раз повторялось 1 слово....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru