繁体   English   中英

将标头从datagridview保存到Excel? 另存为Excel 2007格式(.xlsx)?

[英]Save Headers from datagridview to excel? save as Excel 2007 format (.xlsx)?

我正在尝试创建一个程序,据此我可以从excel文件(.xlsx)导入数据,对其进行更改,然后将其保存回excel文件。 我遇到一些问题,希望您可以帮助我:

  1. 当我将datagridview导出回Excel时,它会漏掉标题,我又该如何将其导出? 其他所有东西都可以出口。

  2. 目前看来,我只能将导出另存为.xls文件,如何将其另存为.xlsx文件。 我已将文件名更改为xlsx,它创建了文件,但由于格式不正确,所以我无法在excel中查看它。

  3. 最后,如上所述,我想将其保存到我导入到datagridview的原始Excel文件中,但是我收到一条错误消息,提示“无法访问..... / debug文件夹,它可能已损坏或只读”。

以下是用于将Excel(.xlsx)数据导入到datagridview的代码

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);
            }
    }

以下是从datagridview到Excel的“保存”代码,尽管格式为.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. 您永远不会使用HeaderText,例如:
    dataGridView1.Columns[X].HeaderText在第一个for循环之前,您可以使用上一行(在X处为列的索引)循环列(作为第二个for循环)。 基本思路:

    for(int索引= 0;索引<= dataGridView1.Columns.Count-1;索引++)
    {
    //dataGridView1.Columns[index] .HeaderText
    }

  2. 在Office 2007之前,您可以使用您的方法。
    但是,在Office 2007及更高版本中,您必须使用OpenXML
    您可以看到一个示例: http : //msdn.microsoft.com/zh-cn/library/bb508943( v=office.12) .aspx您还可以在代码项目中找到一些资源。

  3. 您是否处置了所有使用过的资源?
    另外,如果你写XLS数据XSLX文件,这不是正确的格式(如你看到的)...如果你的DataAdapter没有配置 ,该文件可能锁定(你不能覆盖它)。 但是,这可能是另一个错误(您在哪里有异常?异常的类型是什么?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM