Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存到现有excel文件而不打开新excel文件_C#_Excel - Fatal编程技术网

C# 保存到现有excel文件而不打开新excel文件

C# 保存到现有excel文件而不打开新excel文件,c#,excel,C#,Excel,我有一个示例代码块,您可以在下面看到,这段代码有效地工作。但是这个代码对我来说还不够。所以我需要改进我的代码。 首先,我让datagridview和这个datagridview创建了我的数据块,但我无法将新行写入行之前的下一行。当我向datagridvew添加新数据块时,新数据必须写入excel文件中的旧数据下 private void buttonExcel_Click(object sender, EventArgs e) { // creating

我有一个示例代码块,您可以在下面看到,这段代码有效地工作。但是这个代码对我来说还不够。所以我需要改进我的代码。 首先,我让datagridview和这个datagridview创建了我的数据块,但我无法将新行写入行之前的下一行。当我向datagridvew添加新数据块时,新数据必须写入excel文件中的旧数据下

private void buttonExcel_Click(object sender, EventArgs e)
        {
            // creating Excel Application  
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
            // creating new WorkBook within Excel application  
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
            // creating new Excelsheet in workbook  
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
            // see the excel sheet behind the program  
            app.Visible = true;
            // get the reference of first sheet. By default its name is Sheet1.  
            // store its reference to worksheet  
            worksheet = workbook.Sheets["Sheet1"];
            worksheet = workbook.ActiveSheet;
            // changing the name of active sheet  
            worksheet.Name = "Exported from gridview";
            // storing header part in Excel  
            for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
            {
                worksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
            }
            // storing Each row and column value to excel sheet  
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                }
            }
            // save the application  

            workbook.SaveAs("c:\\PROJE TEKLİF FİYAT.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            // Exit from the application  
            app.Quit();
        }
private void按钮取消单击(对象发送者,事件参数e)
{
//创建Excel应用程序
Microsoft.Office.Interop.Excel.\u应用程序app=新的Microsoft.Office.Interop.Excel.Application();
//在Excel应用程序中创建新工作簿
Microsoft.Office.Interop.Excel.\u工作簿=app.Workbooks.Add(Type.Missing);
//在工作簿中创建新的Excel工作表
Microsoft.Office.Interop.Excel.\u工作表=null;
//请参见程序后面的excel表
app.Visible=true;
//获取第一张图纸的引用。默认情况下,其名称为Sheet1。
//将其引用存储到工作表
工作表=工作簿。工作表[“Sheet1”];
工作表=工作簿.ActiveSheet;
//更改活动图纸的名称
工作表.Name=“从gridview导出”;
//在Excel中存储标题部分
对于(int i=1;i
我使用ClosedXML库(通过NuGet)来实现这一点,因为它使将数据表保存到excel变得非常简单

首先,将现有电子表格作为数据表导入,如下所示:

    public DataTable GetData(string filename)
    {
        using (XLWorkbook workBook = new XLWorkbook(filename))
        {
            //Read the first Sheet from Excel file.
            IXLWorksheet workSheet = workBook.Worksheet(1);

            //Create a new DataTable.
            DataTable dt = new DataTable();

            //Loop through the Worksheet rows.
            bool firstRow = true;
            foreach (IXLRow row in workSheet.Rows())
            {
                //Use the first row to add columns to DataTable.
                if (firstRow)
                {
                    foreach (IXLCell cell in row.Cells())
                    {
                        dt.Columns.Add(cell.Value.ToString());
                    }
                    firstRow = false;
                }
                else
                {
                    //Add rows to DataTable.
                    dt.Rows.Add();
                    int i = 0;

                    foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
                    {
                        dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
                        i++;
                    }
                }
            }
            return dt;
        }
    }
然后将datagridview转换为datatable,然后将现有数据与datagridview数据合并为一个datatable,然后另存为XLSX

using ClosedXML.Excel;
...
private void saveDGV(DataTable existing)
{
    //Creating DataTable.
    DataTable dt = new DataTable();
 
    //Adding the Columns.
    foreach (DataGridViewColumn column in dataGridView1.Columns)
    {
        dt.Columns.Add(column.HeaderText, column.ValueType);
    }
 
    //Adding the Rows.
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        dt.Rows.Add();
        foreach (DataGridViewCell cell in row.Cells)
        {
            dt.Rows[dt.Rows.Count - 1][cell.ColumnIndex] = cell.Value.ToString();
        }
    }
    existing.Merge(dt);
    using (XLWorkbook wb = new XLWorkbook())
    {
        wb.Worksheets.Add(existing, "Exported from gridview");
        //Adjust widths of Columns.
        wb.Worksheet(1).Columns().AdjustToContents();
        wb.SaveAs("c:\\PROJE TEKLİF FİYAT.xlsx")
    }
}
您可以这样使用:

using ClosedXML.Excel;
...
private void buttonExcel_Click(object sender, EventArgs e)
        {
            DataTable existing = GetData("c:\\PROJE TEKLİF FİYAT.xlsx");
            saveDGV(existing);
        }

谢谢你的回答,但这种方式并不是我想要的。当我向excel中添加新行时,此代码会在添加之前清除所有行。我希望当我添加新行时,旧行必须保留在excel文件中,然后新行将添加到旧行的下面。谢谢大家。你救了我。多谢各位。