如何将数据附加到excel文件中

时间:2014-12-17 07:33:08

标签: c# asp.net .net excel

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的细节将附加在同一个文件中而不创建新文件。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要阅读有关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();
}

请注意,您必须为您的DataSet命名,这将是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”.

答案 1 :(得分:1)

如果您想从数据库数据中生成 Excel文件,则报告解决方案是最灵活的方法。另一方面,如果要将数据添加到现有文件,则可以使用Open XML SDK或更高级别的库(如EPPlus)操作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和DataReader读取的方法。这允许您像现在一样读取DataSet,然后将每个数据表添加到相应位置的工作表中,例如:

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

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