Си sharp как создать xlsx datagridview
Перейти к содержимому

Си sharp как создать xlsx datagridview

  • автор:

Передача данных в книгу Excel с помощью Visual C# 2005 или Visual C# .NET

В этой пошаговой статье описывается несколько методов передачи данных в Microsoft Excel 2002 из программы Microsoft Visual C# 2005 или Microsoft Visual C# .NET. В этой статье также представлены преимущества и недостатки каждого метода, чтобы можно было выбрать решение, которое лучше всего подходит для вашей ситуации.

Обзор

Метод, который чаще всего используется для передачи данных в книгу Excel, — это автоматизация. С помощью службы автоматизации можно вызывать методы и свойства, относящиеся к задачам Excel. Автоматизация обеспечивает максимальную гибкость при указании расположения данных в книге, форматировании книги и создании различных параметров во время выполнения.

С помощью службы автоматизации можно использовать несколько методов передачи данных:

  • Передача ячейки данных по ячейкам.
  • Передача данных в массиве в диапазон ячеек.
  • Передача данных из набора записей ADO в диапазон ячеек с помощью метода CopyFromRecordset.
  • Создайте объект QueryTable на листе Excel, содержащий результат запроса к источнику данных ODBC или OLEDB.
  • Передайте данные в буфер обмена, а затем вставьте содержимое буфера обмена на лист Excel.
    Можно также использовать несколько методов, которые не обязательно требуют автоматизации для передачи данных в Excel. Если вы используете серверную программу, это может быть хорошим подходом для отойдите от клиентов к массовой обработке данных.

Для передачи данных без автоматизации можно использовать следующие подходы:

  • Передайте данные в текстовый файл с разделителями-табуляции или разделителями-запятыми, который Excel позже сможет проанализировать в ячейки на листе.
  • Передача данных на лист с помощью ADO.NET.
  • Передача XML-данных в Excel (версии 2002 и 2003) для предоставления данных, отформатированных и упорядоченных по строкам и столбцам.

В этой статье приводится обсуждение и пример кода для каждого из этих методов. В разделе «Создание полного примера проекта Visual C# 2005 или Visual C# .NET» далее в этой статье показано, как создать программу Visual C# .NET, которая выполняет каждый метод.

Методы

Использование службы автоматизации для передачи ячейки данных по ячейкам

С помощью службы автоматизации можно передавать данные на лист по одной ячейке за раз:

// Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Add data to cells in the first worksheet in the new workbook. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objRange.Value = "Last Name"; m_objRange = m_objSheet.get_Range("B1", m_objOpt); m_objRange.Value = "First Name"; m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange.Value = "Doe"; m_objRange = m_objSheet.get_Range("B2", m_objOpt); m_objRange.Value = "John"; // Apply bold to cells A1:B1. m_objRange = m_objSheet.get_Range("A1", "B1"); m_objFont = m_objRange.Font; m_objFont.Bold=true; // Save the Workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); 

Перенос ячеек данных по ячейкам является приемлемым подходом, если имеется небольшое количество данных. Вы можете размещать данные в любом месте книги и условно форматировать ячейки во время выполнения. Однако не рекомендуется использовать этот подход, если у вас есть большой объем данных для передачи в книгу Excel. Каждый объект Range, полученный во время выполнения, приводит к запросу интерфейса, что означает более медленную передачу данных. Кроме того, Microsoft Windows 95, Microsoft Windows 98 и Microsoft Windows Edition (Me) имеют ограничение в 64 килобайта (КБ) на запросы интерфейса. Если у вас есть более 64 КБ запросов интерфейса, сервер автоматизации (Excel) может перестать отвечать на запросы или вы можете получать сообщения об ошибках, указывающие на нехватку памяти.

Опять же, передача ячеек данных допускается только для небольших объемов данных. Если необходимо перенести большие наборы данных в Excel, рассмотрите возможность использования одного из других подходов, описанных в этой статье, для массовой передачи данных.

Для получения дополнительных сведений и примера автоматизации Excel с помощью Visual C# .NET щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:

302084 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Автоматизация Microsoft Excel из Microsoft Visual C# .NET

Использование службы автоматизации для передачи массива данных в диапазон на листе

Массив данных можно передать в диапазон из нескольких ячеек одновременно:

// Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); // Create an array for the headers and add it to cells A1:C1. object[] objHeaders = ; m_objRange = m_objSheet.get_Range("A1", "C1"); m_objRange.Value = objHeaders; m_objFont = m_objRange.Font; m_objFont.Bold=true; // Create an array with 3 columns and 100 rows and add it to // the worksheet starting at cell A2. object[,] objData = new Object[100,3]; Random rdm = new Random((int)DateTime.Now.Ticks); double nOrderAmt, nTax; for(int r=0;r <100;r++) < objData[r,0] = "ORD" + r.ToString("0000"); nOrderAmt = rdm.Next(1000); objData[r,1] = nOrderAmt.ToString("c"); nTax = nOrderAmt*0.07; objData[r,2] = nTax.ToString("c"); >m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange = m_objRange.get_Resize(100,3); m_objRange.Value = objData; // Save the Workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); 

При передаче данных с помощью массива, а не ячейки по ячейкам, можно реализовать огромное повышение производительности с большим количеством данных. Рассмотрим следующие строки из приведенного выше кода, которые переносют данные в 300 ячеек на листе:

objRange = objSheet.get_Range("A2", m_objOpt); objRange = objRange.get_Resize(100,3); objRange.Value = objData; 

Этот код представляет два запроса интерфейса: один для объекта Range, возвращаемого методом Range, и другой для объекта Range, возвращаемого методом Resize. Напротив, для передачи ячейки данных по ячейкам требуются запросы 300 интерфейсов к объектам Range. По возможности вы можете воспользоваться преимуществами массовой передачи данных и сокращения количества запросов интерфейса.

Чтобы получить дополнительные сведения об использовании массивов для получения и задания значений в диапазонах с помощью службы автоматизации Excel, щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:

302096 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Автоматизация Excel с помощью visual C# .NET для заполнения или получения данных в диапазоне с помощью массивов

Использование службы автоматизации для передачи набора записей ADO в диапазон листа

Объектные модели для Excel 2000, Excel 2002 и Excel 2003 предоставляют метод CopyFromRecordset для передачи набора записей ADO в диапазон на листе. В следующем коде показано, как автоматизировать Excel для передачи содержимого таблицы Orders в образце базы данных Northwind с помощью метода CopyFromRecordset:

// Create a Recordset from all the records in the Orders table. ADODB.Connection objConn = new ADODB.Connection(); ADODB._Recordset objRS = null; objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";", "", "", 0); objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient; object objRecAff; objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, (int)ADODB.CommandTypeEnum.adCmdTable); // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); // Get the Fields collection from the recordset and determine // the number of fields (or columns). System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator(); int nFields = objRS.Fields.Count; // Create an array for the headers and add it to the // worksheet starting at cell A1. object[] objHeaders = new object[nFields]; ADODB.Field objField = null; for(int n=0;n m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objRange = m_objRange.get_Resize(1, nFields); m_objRange.Value = objHeaders; m_objFont = m_objRange.Font; m_objFont.Bold=true; // Transfer the recordset to the worksheet starting at cell A2. m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt); // Save the Workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); // Close the recordset and connection. objRS.Close(); objConn.Close(); 

CopyFromRecordset работает только с объектами набора записей ADO. Набор данных, созданный с помощью ADO.NET с методом CopyFromRecordset, нельзя использовать. В следующих разделах показано, как передавать данные в Excel с помощью ADO.NET.

Использование службы автоматизации для создания объекта QueryTable на листе

Объект QueryTable представляет таблицу, созданную на основе данных, возвращаемых из внешнего источника данных. При автоматизации Excel можно создать таблицу QueryTable, указав строку подключения к OLE DB или источнику данных ODBC и строке SQL. Excel создает набор записей и вставляет его на лист в указанном расположении. Объекты QueryTable предоставляют следующие преимущества по сравнению с методом CopyFromRecordset:

  • Excel обрабатывает создание набора записей и его размещение на листе.
  • Вы можете сохранить запрос с объектом QueryTable и обновить его позже, чтобы получить обновленный набор записей.
  • При добавлении новой таблицы QueryTable на лист можно указать, что данные, которые уже существуют в ячейках листа, будут сдвинуты для обработки новых данных (дополнительные сведения см. в свойстве RefreshStyle).

В следующем коде показано, как автоматизировать Excel 2000, Excel 2002 или Excel 2003 для создания таблицы QueryTable на листе Excel с помощью данных из образца базы данных Northwind:

// Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Create a QueryTable that starts at cell A1. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objQryTables = m_objSheet.QueryTables; m_objQryTable = (Excel._QueryTable)m_objQryTables.Add( "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";", m_objRange, "Select * From Orders"); m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows; m_objQryTable.Refresh(false); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); 

Использование буфера обмена Windows

Буфер обмена Windows можно использовать для передачи данных на лист. Чтобы вставить данные в несколько ячеек на листе, можно скопировать строку, в которой столбцы разделены символами ТАБУ, а строки — символами возврата каретки. В следующем коде показано, как visual C# .NET может использовать буфер обмена Windows для передачи данных в Excel:

// Copy a string to the Windows clipboard. string sData = "FirstName\tLastName\tBirthdate\r\n" + "Bill\tBrown\t2/5/85\r\n" + "Joe\tThomas\t1/1/91"; System.Windows.Forms.Clipboard.SetDataObject(sData); // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Paste the data starting at cell A1. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objSheet.Paste(m_objRange, false); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); 

Создание текстового файла с разделителями, который Excel может анализировать по строкам и столбцам

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

В следующем коде показано, как создать текстовый файл с разделителями табуляции на основе данных, считанных с помощью ADO.NET:

// Connect to the data source. System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";"); objConn.Open(); // Execute a command to retrieve all records from the Employees table. System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( "Select * From Employees", objConn); System.Data.OleDb.OleDbDataReader objReader; objReader = objCmd.ExecuteReader(); // Create the FileStream and StreamWriter object to write // the recordset contents to file. System.IO.FileStream fs = new System.IO.FileStream( m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create); System.IO.StreamWriter sw = new System.IO.StreamWriter( fs, System.Text.Encoding.Unicode); // Write the field names (headers) as the first line in the text file. sw.WriteLine(objReader.GetName(0) + "\t" + objReader.GetName(1) + "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) + "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5)); // Write the first six columns in the recordset to a text file as // tab-delimited. while(objReader.Read()) < for(int i=0;i<=5;i++) < if(!objReader.IsDBNull(i)) < string s; s = objReader.GetDataTypeName(i); if(objReader.GetDataTypeName(i)=="DBTYPE_I4") < sw.Write(objReader.GetInt32(i).ToString()); >else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE") < sw.Write(objReader.GetDateTime(i).ToString("d")); >else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR") < sw.Write(objReader.GetString(i)); >> if(i <5) sw.Write("\t"); >sw.WriteLine(); > sw.Flush();// Write the buffered data to the filestream. // Close the FileStream. fs.Close(); // Close the reader and the connection. objReader.Close(); objConn.Close(); 

Упомянутый выше код не использует автоматизацию. Однако при необходимости можно использовать службу автоматизации для открытия текстового файла и сохранения файла в формате книги Excel, как показано ниже.

// Open the text file in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, false, true, false, false, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook = m_objExcel.ActiveWorkbook; // Save the text file in the typical workbook format and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); 

Передача данных на лист с помощью ADO.NET

Вы можете использовать поставщик Microsoft Jet OLE DB для добавления записей в таблицу в существующей книге Excel. Таблица в Excel — это просто диапазон ячеек. Диапазон может иметь определенное имя. Как правило, первая строка диапазона содержит заголовки (или имена полей), а все последующие строки в диапазоне содержат записи.

Следующий код добавляет две новые записи в таблицу в Book7.xls. Таблица в этом случае — Sheet1:

// Establish a connection to the data source. System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder + "Book7.xls;Extended Properties=Excel 8.0;"); objConn.Open(); // Add two records to the table named 'MyTable'. System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(); objCmd.Connection = objConn; objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" + " values ('Bill', 'Brown')"; objCmd.ExecuteNonQuery(); objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" + " values ('Joe', 'Thomas')"; objCmd.ExecuteNonQuery(); // Close the connection. objConn.Close(); 

При добавлении записей с ADO.NET, как показано в этом примере, форматирование в книге сохраняется. Каждая запись, добавляемая в строку, заимствует формат из строки перед ней.

Чтобы получить дополнительные сведения об использовании ADO.NET, щелкните приведенные ниже номера статей, чтобы просмотреть статьи в базе знаний Майкрософт:

306636 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Подключение к базе данных и выполнение команды с помощью ADO.NET и Visual C# .NET

314145 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Заполнение объекта DataSet из базы данных с помощью Visual C# .NET

307587 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Обновление базы данных из объекта DataSet с помощью Visual C# .NET

Дополнительные сведения об использовании поставщика Jet OLEDB с источниками данных Excel см. в приведенных ниже номерах статей, чтобы просмотреть статьи в базе знаний Майкрософт:

278973 ПРИМЕР. ExcelADO демонстрирует использование ADO для чтения и записи данных в книгах Excel

257819 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Использование ADO с данными Excel из Visual Basic или VBA

Передача XML-данных (Excel 2002 и Excel 2003)

Excel 2002 и 2003 может открывать любой XML-файл с правильным форматом. XML-файлы можно открывать напрямую с помощью команды «Открыть» в меню «Файл» или программным способом с помощью методов Open или OpenXML коллекции книг. При создании XML-файлов для использования в Excel можно также создать таблицы стилей для форматирования данных.

Создание полного примера проекта .NET для Visual C#

  1. Создайте папку C:\ExcelData. В примере программы книги Excel будут храниться в этой папке.
  2. Создайте новую книгу для примера для записи в:
    1. Запустите новую книгу в Excel.
    2. На листе 1 новой книги введите FirstName в ячейке A1 и LastName в ячейке B1.
    3. Выберите A1:B1.
    4. В меню «Вставка» наведите указатель мыши на «Имя» и нажмите кнопку «Определить». Введите имя MyTable и нажмите кнопку «ОК».
    5. Сохраните книгу как C:\Exceldata\Book7.xls.
    6. Закройте Excel.
    1. On the Project menu, click Add Reference.
    2. На вкладке NET найдите ADODB и нажмите кнопку «Выбрать».

    Обратите внимание, что в Visual Studio 2005 не нужно нажать кнопку «Выбрать».
    3. На вкладке COM найдите библиотеку объектов Microsoft Excel 10.0 или библиотеку объектов Microsoft Excel 11.0 и нажмите кнопку «Выбрать».

    Обратите внимание, что в Visual Studio 2005 не нужно нажать кнопку «Выбрать».

    Обратите внимание, что если вы используете Microsoft Excel 2002 и еще не сделали этого, корпорация Майкрософт рекомендует скачать и установить основные сборки взаимодействия Microsoft Office XP.

    1. В режиме конструктора для Form1.cs дважды щелкните Form1.

    Обработчик события загрузки формы создается и отображается в Файле Form1.cs.
    2. В меню «Вид» щелкните «Конструктор», чтобы перейти в режим конструктора.
    3. Дважды щелкните кнопку Button1.

    Обработчик события Click кнопки создается и отображается в Файле Form1.cs.

    private void Form1_Load(object sender, System.EventArgs e) < >private void button1_Click(object sender, System.EventArgs e)
     // Excel object references. private Excel.Application m_objExcel = null; private Excel.Workbooks m_objBooks = null; private Excel._Workbook m_objBook = null; private Excel.Sheets m_objSheets = null; private Excel._Worksheet m_objSheet = null; private Excel.Range m_objRange = null; private Excel.Font m_objFont = null; private Excel.QueryTables m_objQryTables = null; private Excel._QueryTable m_objQryTable = null; // Frequenty-used variable for optional arguments. private object m_objOpt = System.Reflection.Missing.Value; // Paths used by the sample code for accessing and storing data. private object m_strSampleFolder = "C:\\ExcelData\\"; private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb"; private void Form1_Load(object sender, System.EventArgs e) < comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; comboBox1.Items.AddRange(new object[]< "Use Automation to Transfer Data Cell by Cell ", "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", "Use Automation to Create a QueryTable on a Worksheet", "Use the Clipboard", "Create a Delimited Text File that Excel Can Parse into Rows and Columns", "Transfer Data to a Worksheet Using ADO.NET ">); comboBox1.SelectedIndex = 0; button1.Text = "Go!"; > private void button1_Click(object sender, System.EventArgs e) < switch (comboBox1.SelectedIndex) < case 0 : Automation_CellByCell(); break; case 1 : Automation_UseArray(); break; case 2 : Automation_ADORecordset(); break; case 3 : Automation_QueryTable(); break; case 4 : Use_Clipboard(); break; case 5 : Create_TextFile(); break; case 6 : Use_ADONET(); break; >//Clean-up m_objFont = null; m_objRange = null; m_objSheet = null; m_objSheets = null; m_objBooks = null; m_objBook = null; m_objExcel = null; GC.Collect(); > private void Automation_CellByCell() < // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Add data to cells of the first worksheet in the new workbook. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objRange.set_Value(m_objOpt,"Last Name"); m_objRange = m_objSheet.get_Range("B1", m_objOpt); m_objRange.set_Value(m_objOpt,"First Name"); m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange.set_Value(m_objOpt,"Doe"); m_objRange = m_objSheet.get_Range("B2", m_objOpt); m_objRange.set_Value(m_objOpt,"John"); // Apply bold to cells A1:B1. m_objRange = m_objSheet.get_Range("A1", "B1"); m_objFont = m_objRange.Font; m_objFont.Bold=true; // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); >private void Automation_UseArray() < // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); // Create an array for the headers and add it to cells A1:C1. object[] objHeaders = ; m_objRange = m_objSheet.get_Range("A1", "C1"); m_objRange.set_Value(m_objOpt,objHeaders); m_objFont = m_objRange.Font; m_objFont.Bold=true; // Create an array with 3 columns and 100 rows and add it to // the worksheet starting at cell A2. object[,] objData = new Object[100,3]; Random rdm = new Random((int)DateTime.Now.Ticks); double nOrderAmt, nTax; for(int r=0;r <100;r++) < objData[r,0] = "ORD" + r.ToString("0000"); nOrderAmt = rdm.Next(1000); objData[r,1] = nOrderAmt.ToString("c"); nTax = nOrderAmt*0.07; objData[r,2] = nTax.ToString("c"); >m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange = m_objRange.get_Resize(100,3); m_objRange.set_Value(m_objOpt,"objData"); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); > private void Automation_ADORecordset() < // Create a Recordset from all the records in the Orders table. ADODB.Connection objConn = new ADODB.Connection(); ADODB._Recordset objRS = null; objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";", "", "", 0); objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient; object objRecAff; objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, (int)ADODB.CommandTypeEnum.adCmdTable); // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); // Get the Fields collection from the recordset and determine // the number of fields (or columns). System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator(); int nFields = objRS.Fields.Count; // Create an array for the headers and add it to the // worksheet starting at cell A1. object[] objHeaders = new object[nFields]; ADODB.Field objField = null; for(int n=0;nm_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objRange = m_objRange.get_Resize(1, nFields); m_objRange.set_Value(m_objOpt,objHeaders); m_objFont = m_objRange.Font; m_objFont.Bold=true; // Transfer the recordset to the worksheet starting at cell A2. m_objRange = m_objSheet.get_Range("A2", m_objOpt); m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); //Close the recordset and connection objRS.Close(); objConn.Close(); > private void Automation_QueryTable() < // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Create a QueryTable that starts at cell A1. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objQryTables = m_objSheet.QueryTables; m_objQryTable = (Excel._QueryTable)m_objQryTables.Add( "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";", m_objRange, "Select * From Orders"); m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows; m_objQryTable.Refresh(false); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); >private void Use_Clipboard() < // Copy a string to the clipboard. string sData = "FirstName\tLastName\tBirthdate\r\n" + "Bill\tBrown\t2/5/85\r\n" + "Joe\tThomas\t1/1/91"; System.Windows.Forms.Clipboard.SetDataObject(sData); // Start a new workbook in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt)); // Paste the data starting at cell A1. m_objSheets = (Excel.Sheets)m_objBook.Worksheets; m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1)); m_objRange = m_objSheet.get_Range("A1", m_objOpt); m_objSheet.Paste(m_objRange, false); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); >private void Create_TextFile() < // Connect to the data source. System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";"); objConn.Open(); // Execute a command to retrieve all records from the Employees table. System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( "Select * From Employees", objConn); System.Data.OleDb.OleDbDataReader objReader; objReader = objCmd.ExecuteReader(); // Create the FileStream and StreamWriter object to write // the recordset contents to file. System.IO.FileStream fs = new System.IO.FileStream( m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create); System.IO.StreamWriter sw = new System.IO.StreamWriter( fs, System.Text.Encoding.Unicode); // Write the field names (headers) as the first line in the text file. sw.WriteLine(objReader.GetName(0) + "\t" + objReader.GetName(1) + "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) + "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5)); // Write the first six columns in the recordset to a text file as // tab-delimited. while(objReader.Read()) < for(int i=0;i<=5;i++) < if(!objReader.IsDBNull(i)) < string s; s = objReader.GetDataTypeName(i); if(objReader.GetDataTypeName(i)=="DBTYPE_I4") < sw.Write(objReader.GetInt32(i).ToString()); >else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE") < sw.Write(objReader.GetDateTime(i).ToString("d")); >else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR") < sw.Write(objReader.GetString(i)); >> if(i <5) sw.Write("\t"); >sw.WriteLine(); > sw.Flush();// Write the buffered data to the FileStream. // Close the FileStream. fs.Close(); // Close the reader and the connection. objReader.Close(); objConn.Close(); // ================================================================== // Optionally, automate Excel to open the text file and save it in the // Excel workbook format. // Open the text file in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, false, true, false, false, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook = m_objExcel.ActiveWorkbook; // Save the text file in the typical workbook format and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit(); > private void Use_ADONET() < // Establish a connection to the data source. System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder + "Book7.xls;Extended Properties=Excel 8.0;"); objConn.Open(); // Add two records to the table named 'MyTable'. System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(); objCmd.Connection = objConn; objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" + " values ('Bill', 'Brown')"; objCmd.ExecuteNonQuery(); objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" + " values ('Joe', 'Thomas')"; objCmd.ExecuteNonQuery(); // Close the connection. objConn.Close(); >> // End Class >// End namespace 
    using System.Reflection; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel; 

    Ссылки

    Дополнительные сведения см. на следующем веб-сайте корпорации Майкрософт: .

    Си sharp как создать xlsx datagridview

    Имеется грид с данными
    dtgrid.jpg

    хочу экспортировать в ексель.

    Пользуюсь следующим кодом

    using System; using Excel; using System.Windows.Forms; using System.IO; using System.Data; . public static void ExportDataGridViewToExcel(DataGridView sourceDataGridView) < Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing); Microsoft.Office.Interop.Excel._Worksheet worksheet = null; try < worksheet = workbook.ActiveSheet; worksheet.Name = "ExportedFromDataGrid"; int cellRowIndex = 1; int cellColumnIndex = 1; //Loop through each row and read value from each column. for (int i = -1; i < sourceDataGridView.Rows.Count - 1; i++) < for (int j = 0; j < sourceDataGridView.Columns.Count; j++) < // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check. if (cellRowIndex == 1) < worksheet.Cells[cellRowIndex, cellColumnIndex] = sourceDataGridView.Columns[j].HeaderText; >else < worksheet.Cells[cellRowIndex, cellColumnIndex] = sourceDataGridView.Rows[i].Cells[j].Value; >cellColumnIndex++; > cellColumnIndex = 1; cellRowIndex++; > //Getting the location and file name of the excel to save from user. SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"; saveDialog.FilterIndex = 1; if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) < workbook.SaveAs(saveDialog.FileName); MessageBox.Show("Експорт завершений", "Експорт результатів", MessageBoxButtons.OK, MessageBoxIcon.Information); >> catch (System.Exception ex) < MessageBox.Show(ex.Message); >finally < excel.Quit(); workbook = null; excel = null; >>

    но в екселе получаю несоответсвие
    xls.jpg.

    Как можно сделать експорт в ексель идентичные с гридом данные?

    Кто умер, но не забыт, тот бессмертен.
    Лао-Цзы.

    Aleksandr H.
    Посмотреть профиль
    Найти ещё сообщения от Aleksandr H.

    Экспорт данных в ексель си шарп

    Author24 — интернет-сервис помощи студентам

    Здравствуйте, помогите пожалуйста, возникла проблема при експорте данных в ексель. Нужно чтобы таблица была выделена рамкой в екселе, и шапка х и у были отличались от данных содержащихся в таблице. Еще нужно чтобы при вводе в датугридвью букв удалялась вся строка при экспорте. Прикладываю файл разработанного приложения.

    Лабораторная 7.rar (85.2 Кб, 41 просмотров)

    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Экспорт данных в Ексель
    Уважаемые спецы или просто продвинутые пользователи БД. Возможно ли из БД организовать заполнение.

    Экспорт в Ёксель
    Доброго времени суток! Есть ‘Экспортируем отфильтрованные данные в Ёксель Private Sub.

    Экспорт таблицы в ексель
    написал вот такой код для экспорта таблицы в ексель try < JFileChooser fileChooser =.

    Экспорт из Аксесс в Ексель тблЗапроса. с фильтром
    Добрый день, уважаемые гуру Аксесс! Простая форма. Есть кнопка "Мои проекты". — При нажатии.

    87844 / 49110 / 22898
    Регистрация: 17.06.2006
    Сообщений: 92,604
    Помогаю со студенческими работами здесь

    Экспорт запросов в ексель в разные листы
    Честной народ, подскажите 1. как в 2010 аксе экспортировать несколько разных запросов в один файл.

    Си шарп, выбор данных из Текстбокса
    Как сделать так чтоб, когда выбираешь данные из текстбоксов и заносишь в последний текстбокс при.

    Преобразование данных Ексель
    Добрый день, Прошу помочь преобразовать данные из одного вида отображения в другой. Во вложении.

    Перенос данных в ексель
    Добрый день. требуется помощь. Есть файл эксель, который имеет большое количество вкладок. В.

    Си шарп- DataGridView работа с булевым типом данных
    Задача: DataGridView отображает поля из базы данных с булевым типом, смысл в том что пользователь.

    Или воспользуйтесь поиском по форуму:

    Си sharp как создать xlsx datagridview

    Создала приложение на C# для работы с большим массивом данных.
    — Сначала в таблицу dataGridView загружаются документы Word и содержимое раскидывается по колонкам
    — Затем таблица dataGridView выгружается в Excel.
    Вопрос в том, что при выгрузке в Excel № почему-то выгружаются в формате даты (ставит мне дату, подходящую этому номеру).

    ? — Как установить формат ячеек в Excel через С#?
    Таблицу я выгружаю всегда в новый документ Эксель, поэтому заранее отредактировать колонки не имею возможности.

    private void button6_Click(object sender, EventArgs e) // Создаем Excel //
    Excel.Application excel = new Excel.Application(); // Создаем СОМ — объект Excel //
    excel.Visible = true; // делаем объект видимым //
    excel.SheetsInNewWorkbook = 4; // количество листов в книге //
    excel.Workbooks.Add(Type.Missing); // добавляем книгу //
    Excel.Workbook workbook = excel.Workbooks[1]; // получаем ссылку на первую открытую книгу //
    Excel.Worksheet sheet = workbook.Worksheets.get_Item(1); // получаем ссылку на первый лист //

    int rowExcel = 2; // начать со второй строки //
    for (int i = 0; i < dataGridView1.Rows.Count; i++) // int i = 0 - начальное положение, индекс первого просматриваемого элемента; условие выхода из цикла; шаг движения по циклу //
    sheet.Cells[rowExcel, «A»] = dataGridView1.Rows[i].Cells[«Column1»].Value; // заполняем строку //
    sheet.Cells[rowExcel, «B»] = dataGridView1.Rows[i].Cells[«Column2»].Value; // В столбец «В» заполняем значения из колонки 2 ДатаГрида //
    sheet.Cells[rowExcel, «C»] = dataGridView1.Rows[i].Cells[«Column3»].Value;

    sheet.Cells[1, 1] = «№ п/п»;
    sheet.Cells[1, 2] = «Фамилия_Имя_Отчество» ;
    sheet.Cells[1, 3] = » № производства»;
    sheet.Cells.get_Range(«A1», «E1»).Font.Bold = true; // делаем их жирными //
    sheet.Cells.get_Range(«A1», «E1»).ColumnWidth = 15;// ширина столбца //
    sheet.Cells.get_Range(«A1», «E1»).ColumnWidth = 15; // размер шрифта //
    sheet.Cells.get_Range(«C1», «C20»).NumberFormat = «String»;

    Последний раз редактировалось ya_yanchik-2909; 07.12.2016 в 05:59 .

    ya_yanchik-2909
    Посмотреть профиль
    Найти ещё сообщения от ya_yanchik-2909

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *