Сохранить заголовки из datagridview, чтобы преуспеть?сохранить в формате Excel 2007 (.xlsx)? - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь создать программу, с помощью которой я импортирую данные из файла Excel (.xlsx), вносю в них изменения и затем сохраняю их обратно в файл Excel.У меня есть пара вопросов, с которыми я застрял, и надеюсь, вы могли бы помочь мне с этим:

  1. Когда я экспортирую таблицу данных обратно в Excel, он пропускает заголовки, как я могу его получить?экспортировать это также?Все остальное экспортируется нормально.

  2. На данный момент кажется, что я могу только сохранить экспорт как файл .xls, как я могу сохранить его как файл .xlsx.Я изменил имя файла на xlsx, он создает файл, но я не могу просмотреть его в Excel, потому что неверный формат.

  3. Наконец, как и выше, я хотел сохранить его в исходном файле Excelгде я импортировал в сетку данных, однако я получаю сообщение об ошибке: «Не удается получить доступ к папке ..... / debug, она может быть повреждена или доступна только для чтения».

код для импорта данных Excel (.xlsx) в таблицу данных

public Form1()
    {
        InitializeComponent();

        // populate the dataGridView with the Excel File
        string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;
                                               """, @"C:\Documents and Settings\User\Desktop\Visual Studio\GBstock\GBstock\bin\Debug\FORM TEST.xlsx");
        string query = String.Format("select * from [{0}$]", "Sheet1");
        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);
        dataGridView1.DataSource = dataSet.Tables[0];

        // populates the comboBox (cbSuppList) with all column headers
        for (int i = 3; i < dataGridView1.Columns.Count; i++)
            {
                cbSuppList.Items.Add(dataGridView1.Columns[i].HeaderText);
            }
    }

Ниже приведен код «Сохранить» из таблицы данных в Excel в формате allbeit .xls

private void btnSave_Click(object sender, EventArgs e)
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        int i = 0;
        int j = 0;

        for (i = 0; i <= dataGridView1.Rows.Count - 1; i++)
        {
            for (j = 0; j <= dataGridView1.Columns.Count - 1; j++)
            {
                DataGridViewCell cell = dataGridView1[j, i];
                xlWorkSheet.Cells[i + 1, j + 1] = cell.Value;
            }
        }
        xlWorkBook.SaveAs("C:/Documents and Settings/User/Desktop/Visual Studio/GBstock/GBstock/bin/Debug/FORM TEST.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
    }

1 Ответ

1 голос
/ 08 марта 2012
  1. Вы никогда не используете HeaderText, например:
    dataGridView1.Columns[X].HeaderText Перед первым циклом for вы можете зациклить столбец (как второй цикл for), используя предыдущую строку (с X индексом столбца). Основная идея:

    для (int index = 0; index <= dataGridView1.Columns.Count - 1; index ++) <br> {
    //dataGridView1.Columns[index] .HeaderText
    }

  2. До выпуска Office 2007 вы можете использовать свой метод.
    Но с Office 2007 и более, вы должны использовать OpenXML
    Вы можете увидеть пример: http://msdn.microsoft.com/en-us/library/bb508943(v=office.12).aspx Вы также можете найти некоторые ресурсы в код проекта .

  3. Вы утилизировали все использованные ресурсы?
    Кроме того, если вы записываете данные xls в файл xslx, это неправильный формат (как вы видите) ... Если ваш dataAdapter не расположен , файл может быть заблокирован (вы не можете перезаписать его). Но это может быть другая ошибка (где у вас есть исключение? Какой тип исключения?)

...