【问题标题】:how to append data into excel file如何将数据附加到excel文件中
【发布时间】:2014-12-17 07:33:07
【问题描述】:
designation table:

deg_no  deg_name
1   XYZ
2   ABC
3   pqs 
4   qwe
5   tyu
6   pqr
7   lkj
8   you
9   zzz
10  xxx


ds = cls.ReturnDataSet("RetriveData_Alias1",
         new SqlParameter("@Field", "deg_no"),
        new SqlParameter("@TblNm", "designation"));


for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
    DataSet ds1 = new DataSet();
    ds1 = cls.ReturnDataSet("RetriveData_Alias1",
      new SqlParameter("@Field", "user_id,user_name"),
      new SqlParameter("@TblNm", "User_details"),
      new SqlParameter("@WhereClause", "where deg_no ='" + ds.Tables[0].Rows[i]["deg_no"].ToString() + "' "));
}

这个 for 循环将一直运行到 deg_no=10 并提供所有用户详细信息,它提供了我想要的完美输出 输出。

但我想将这些数据写入 excel 文件:user_details.xls

假设当 i=1 时,它会给你

user_id   user_name    deg_no
1          xyz      1

对于 i=2

user_id   user_name    deg_no
2          pqr      3

等等……

但没有每次都创建新文件。

假设在第一个循环中它将插入 user_id =1 的记录 然后在第二个循环中,将 user_id=2 的详细信息附加到同一个文件中,而不创建新文件。

我该怎么做?

【问题讨论】:

  • 我建议在必须使用 Excel 工作表(2007 和更新版本)的项目中使用 EPPlus 库。它不使用互操作组件,因此您不需要在使用它的地方安装 Office:epplus.codeplex.com

标签: c# asp.net .net excel


【解决方案1】:

如果您想从数据库数据生成 Excel 文件,报告解决方案是最灵活的方法。另一方面,如果您想将数据添加到已经存在的文件中,您可以使用Open XML SDKEPPlus 等更高级别的库来操作Excel 文件。 EPPlus 以 NuGet 包的形式提供,因此您可以轻松地将其添加到您的项目中。

EPPlus 的项目站点包含各种示例。创建 Excel 工作表可以很简单:

        FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample6.xlsx");

        ExcelPackage pck = new ExcelPackage(newFile);
        //Add the Content sheet
        var ws = pck.Workbook.Worksheets.Add("Content");
        ws.Cells["B1"].Value = "Name";
        ws.Cells["C1"].Value = "Size";
        ws.Cells["D1"].Value = "Created";
        ws.Cells["E1"].Value = "Last modified";

EPPlus 还允许您使用 LINQ 查询 Excel 表格,甚至可以直接将 IEnumerable 集合转换为 Excel 表格:

ws.Cells["A1"].LoadFromCollection(myList, true);

这将用 myList 中对象的属性值填充一个表。

EPPlus 还具有从 DataTables 和 DataReaders 读取的方法。这使您可以像以前一样读取 DataSet,然后将每个 Datatable 添加到工作表的适当位置,例如:

ws.Cells["A1"].LoadFromDataTable(ds1.Tables[0], true);
...
ws.Cells["A30"].LoadFromDataTable(ds1.Tables[0], true);

当您不想使用完整的报告解决方案时,您可以使用 EPPlus 生成快速而肮脏的 Excel 报告。

【讨论】:

    【解决方案2】:

    你需要了解 ASP.Net Report Viewer 控件

    希望对你有帮助

    ASP.Net Report Viewer control Tutorial with example

    或者你可以使用

    Export to EXCEL from Datatable in C#.Net

    或者您需要 Office Interop 作为参考,然后让我们进行编码

    using Microsoft.Office.Interop.Excel;
    
    public void DataSetsToExcel(List<DataSet> dataSets, string fileName)
    {
    Microsoft.Office.Interop.Excel.Application xlApp = 
              new Microsoft.Office.Interop.Excel.Application();
    Workbook xlWorkbook = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
    Sheets xlSheets = null;
    Worksheet xlWorksheet = null;
    
    foreach (DataSet dataSet in dataSets)
    {
        System.Data.DataTable dataTable = dataSet.Tables[0];
        int rowNo = dataTable.Rows.Count;
        int columnNo = dataTable.Columns.Count;
        int colIndex = 0;
    
        //Create Excel Sheets
        xlSheets = xlWorkbook.Sheets;
        xlWorksheet = (Worksheet)xlSheets.Add(xlSheets[1], 
                       Type.Missing, Type.Missing, Type.Missing);
        xlWorksheet.Name = dataSet.DataSetName;
    
        //Generate Field Names
        foreach (DataColumn dataColumn in dataTable.Columns)
        {
            colIndex++;
            xlApp.Cells[1, colIndex] = dataColumn.ColumnName;
        }
    
        object[,] objData = new object[rowNo, columnNo];
    
        //Convert DataSet to Cell Data
        for (int row = 0; row < rowNo; row++)
        {
            for (int col = 0; col < columnNo; col++)
            {
                objData[row, col] = dataTable.Rows[row][col];
            }
        }
    
        //Add the Data
        Range range = xlWorksheet.Range[xlApp.Cells[2, 1], xlApp.Cells[rowNo + 1, columnNo]];
        range.Value2 = objData;
    
        //Format Data Type of Columns 
        colIndex = 0;
        foreach (DataColumn dataColumn in dataTable.Columns)
        {
            colIndex++;
            string format = "@";
            switch (dataColumn.DataType.Name)
            {
                case "Boolean":
                    break;
                case "Byte":
                    break;
                case "Char":
                    break;
                case "DateTime":
                    format = "dd/mm/yyyy";
                    break;
                case "Decimal":
                    format = "$* #,##0.00;[Red]-$* #,##0.00";
                    break;
                case "Double":
                    break;
                case "Int16":
                    format = "0";
                    break;
                case "Int32":
                    format = "0";
                    break;
                case "Int64":
                    format = "0";
                    break;
                case "SByte":
                    break;
                case "Single":
                    break;
                case "TimeSpan":
                    break;
                case "UInt16":
                    break;
                case "UInt32":
                    break;
                case "UInt64":
                    break;
                default: //String
                    break;
            }
            //Format the Column accodring to Data Type
            xlWorksheet.Range[xlApp.Cells[2, colIndex], 
                  xlApp.Cells[rowNo + 1, colIndex]].NumberFormat = format;
        }
    }
    
    //Remove the Default Worksheet
    ((Worksheet)xlApp.ActiveWorkbook.Sheets[xlApp.ActiveWorkbook.Sheets.Count]).Delete();
    
    //Save
    xlWorkbook.SaveAs(fileName,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        XlSaveAsAccessMode.xlNoChange,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value,
        System.Reflection.Missing.Value);
    
    xlWorkbook.Close();
    xlApp.Quit();
    GC.Collect();
    }
    

    请注意,您必须为数据集命名,这将是 Excel 中工作表的名称。

    DataSet dataSet1 = new DataSet("My Data Set 1");
    dataAdapter1.Fill(dataSet1);
    
    DataSet dataSet2 = new DataSet("My Data Set 2");
    dataAdapter1.Fill(dataSet2);
    
    DataSet dataSet3 = new DataSet("My Data Set 3");
    dataAdapter1.Fill(dataSet3);
    
    List<DataSet> dataSets = new List<DataSet>();
    dataSets.Add(dataSet1);
    dataSets.Add(dataSet2);
    dataSets.Add(dataSet3);
    
    DataSetsToExcel(dataSets, "{Your File Name}")
    

    添加 Office Interop 作为参考

    按照以下步骤:

    On the Project menu, click Add Reference.
    On the COM tab, locate Microsoft Excel Object Library, and then click Select. In Visual Studio 2010, locate Microsoft Excel --.- Object Library on the COM tab.
    Click OK in the Add References dialog box to accept your selections. If you are prompted to generate wrappers for the libraries that you selected, click “Yes”.
    

    【讨论】:

    • 谢谢,但我不想要 RDLC 报告,而且我没有数据网格。
    • 是否需要导出到多个 Excel 工作表?
    • 这不是强制性的……它可以在同一张纸上。 .如果它在不同的工作表中,那也很好。
    • 命名空间“office”在命名空间“microsoft”中不存在
    • 您是否添加了 Office Interop 作为参考
    猜你喜欢
    • 2013-01-24
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多