【问题标题】:Export dataset items to excel sheet将数据集项目导出到 Excel 工作表
【发布时间】:2012-07-13 07:22:17
【问题描述】:

我在我的 asp.net 应用程序中使用 Followin LOC 来导出和导入 Excel 表

 protected void LinkbuttonExportToExcel_Click(object sender, EventArgs e)
{
    UserManager manager = new UserManager();
    DataSet dataSet = manager.GetProductDataToExport();

    string attachment = "attachment; filename=Report.xls";
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/vnd.ms-excel";
    string tab = "";
    string tab1 = "";
    foreach (DataTable table in dataSet.Tables)
    {
        foreach (DataColumn column in table.Columns)
        {
           Response.Write(tab1 + column.ColumnName);
           tab1 = "\t";
        }
    }
    tab = "\n";
        foreach (DataRow dr in dataSet.Tables[0].Rows)
    {
       for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++)
        {
          Response.Write(tab + dr[i].ToString());
          tab = "\t";
        }
        tab = "\n";
    }
    Response.End();
}

protected void ButtonImportDataFromExcel_Click(object sender, EventArgs e)
{
    FileUpload1.PostedFile.SaveAs(Server.MapPath("~/App_Data/ProductImport.xls"));
    OleDbConnection objXConn = new OleDbConnection();
    objXConn.ConnectionString = ConfigurationManager.ConnectionStrings["sqlXCon"].ConnectionString;
   if (objXConn.State == ConnectionState.Closed)
    {
        objXConn.Open();
    }

        DataTable dt = new DataTable();
        dt = objXConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        string excelSheetName = string.Empty; ;
        foreach (DataRow row in dt.Rows)
        {
          excelSheetName = row["TABLE_NAME"].ToString();
        }
        OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" +  excelSheetName + "]", objXConn);
        OleDbDataReader rd = cmd.ExecuteReader();
        UserManager manager = new UserManager();

        while (rd.Read())
        {
            int productId = int.Parse((rd.GetValue(0).ToString()));
            string productName = (rd.GetValue(1).ToString());
            string productNameHindi = (rd.GetValue(2).ToString());
            decimal productPrice = decimal.Parse((rd.GetValue(3).ToString()));
            string productStatus = (rd.GetValue(4).ToString());
            manager.UpdateProductMasterFromExcelSheet(productId, productName);
        }
    }
    else
    {
        objXConn.Close();
    }
    msgBox1.alert("Products updated successfully");
}

}

我正在使用以下连接字符串..

<add name="sqlXCon" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source='|DataDirectory|ProductImport.xls';Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';" />

文件 Report.xls 成功导出。但问题是我无法导入“Report.xls”,除非我打开文件并再次将其另存为 .xls。为什么会这样?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    有关 Excel InterOp 的更多信息。请参考这个网站..

    Excel.Interop

    【讨论】:

      【解决方案2】:

      发生这种情况的原因是因为您并没有真正导出 Excel 文件:您的 LinkbuttonExportToExcel_Click 会生成一个制表符分隔值文件,该文件可以由 Excel 打开,但不是 Excel 文件。

      另一方面,您的 ButtonImportDataFromExcel_Click 函数从 Excel 文件中读取(该文件必须是真正的 Excel 文件,而不是 TSV)

      所以你实际上必须手动打开它并通过再次保存将其转换为 xls。

      为此,如果您的服务器上有 Excel,您可以使用 Excel.Interop 生成您的 Excel 文件,或者使用开源库来生成您的 Excel 文件。

      【讨论】:

      • 以这种方式..会尝试..谢谢@T。法布尔
      【解决方案3】:

      使用Excel Libraray,从http://code.google.com/p/excellibrary/downloads/list下载

      using System;
      using System.Data;
      using System.IO;
       using ExcelLibrary.SpreadSheet;
      
       namespace ExcelLibrary
       {
       /// <summary>
       /// Provides simple way to convert Excel workbook into DataSet
       /// </summary>
       public sealed class DataSetHelper
       {
      /// <summary>
      /// Populate all data (all converted into String) in all worksheets 
      /// from a given Excel workbook.
      /// </summary>
      /// <param name="filePath">File path of the Excel workbook</param>
      /// <returns>DataSet with all worksheet populate into DataTable</returns>
      public static DataSet CreateDataSet(String filePath)
      {
          DataSet ds = new DataSet();
          Workbook workbook = Workbook.Load(filePath);
          foreach (Worksheet ws in workbook.Worksheets)
          {
              DataTable dt = PopulateDataTable(ws);
              ds.Tables.Add(dt);
          }
          return ds;
      }
      
      /// <summary>
      /// Populate data (all converted into String) from a given Excel 
      /// workbook and also work sheet name into a new instance of DataTable.
      /// Returns null if given work sheet is not found.
      /// </summary>
      /// <param name="filePath">File path of the Excel workbook</param>
      /// <param name="sheetName">Worksheet name in workbook</param>
      /// <returns>DataTable with populate data</returns>
      public static DataTable CreateDataTable(String filePath, String sheetName)
      {
          Workbook workbook = Workbook.Load(filePath);
          foreach (Worksheet ws in workbook.Worksheets)
          {
              if (ws.Name.Equals(sheetName))
                  return PopulateDataTable(ws);
          }
          return null;
      }
      
      private static DataTable PopulateDataTable(Worksheet ws)
      {
          CellCollection Cells = ws.Cells;
      
          // Creates DataTable from a Worksheet
          // All values will be treated as Strings
          DataTable dt = new DataTable(ws.Name);
      
          // Extract columns
          for (int i = 0; i <= Cells.LastColIndex; i++)
              dt.Columns.Add(Cells[0, i].StringValue, typeof(String));
      
          // Extract data
          for (int currentRowIndex = 1; currentRowIndex <= Cells.LastRowIndex; currentRowIndex++)
          {
              DataRow dr = dt.NewRow();
              for (int currentColumnIndex = 0; currentColumnIndex <= Cells.LastColIndex; currentColumnIndex++)
                  dr[currentColumnIndex] = Cells[currentRowIndex, currentColumnIndex].StringValue;
              dt.Rows.Add(dr);
          }
      
          return dt;
      }
      
      /// <summary>
      /// Populate all data from the given DataSet into a new Excel workbook
      /// </summary>
      /// <param name="filePath">File path to new Excel workbook to be created</param>
      /// <param name="dataset">Source DataSet</param>
      public static void CreateWorkbook(String filePath, DataSet dataset)
      {
          if (dataset.Tables.Count == 0)
              throw new ArgumentException("DataSet needs to have at least one DataTable", "dataset");
      
          Workbook workbook = new Workbook();
          foreach (DataTable dt in dataset.Tables)
          {
              Worksheet worksheet = new Worksheet(dt.TableName);
              for (int i = 0; i < dt.Columns.Count; i++)
              {
                  // Add column header
                  worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName);
      
                  // Populate row data
                  for (int j = 0; j < dt.Rows.Count; j++)
                      worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i]);
              }
              workbook.Worksheets.Add(worksheet);
          }
          workbook.Save(filePath);
      }
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多