【问题标题】:How to export list to excel without Microsoft.Office.Interop.Excel.dll如何在没有 Microsoft.Office.Interop.Excel.dll 的情况下将列表导出到 excel
【发布时间】:2016-10-30 22:55:24
【问题描述】:

我有如下的 foo 列表。如何在没有Microsoft.Office.Interop.Excel.dll的情况下将其导出到excel

public class Foo
{
    public DateTime Column1 { get; set; }
    public string Column2 { get; set; }
    public decimal Column3 { get; set; }
    public bool Column4 { get; set; }
}

【问题讨论】:

  • 我很欣赏这个问题看起来略有相同,但这是不使用 MS Interop Excel 的情况,并且该解决方案在使用 excel 时非常简洁。

标签: c# .net


【解决方案1】:

您可以使用 ClosedXML 库(https://closedxml.codeplex.com/)来做到这一点

我只是写了一个简单的例子来告诉你如何命名文件、工作表和选择单元格:

        var workbook = new XLWorkbook();
        workbook.AddWorksheet("sheetName");
        var ws = workbook.Worksheet("sheetName");

        int row = 1;
        foreach (Foo f in fooList)
        {
            string rowString = row.ToString();
            ws.Cell("A" + rowString).Value = f.Column1;
            ws.Cell("B" + rowString).Value = f.Column2;
            ws.Cell("C" + rowString).Value = f.Column3;
            ws.Cell("D" + rowString).Value = f.Column4;
            row++;
        }

        workbook.SaveAs("yourExcel.xlsx");

如果您愿意,您可以创建一个包含所有数据的 System.Data.DataSet 或 System.Data.DataTable,然后使用 workbook.AddWorksheet(yourDataset)workbook.AddWorksheet(yourDataTable) 将其添加为工作集;

【讨论】:

    【解决方案2】:

    使用 c# 将列表导出到 excel 的超级简单方法

    如何使用 NuGet Packager Manager 控制台安装 ClosedXML:PM> Get-Project [ProjectName] |安装包 ClosedXML

            using (var conn = new DB.UpdatesEntities())
            {
                var stories = (from a in conn.Subscribers
                               orderby a.DT descending
                               select a).Take(100).ToList();
    
                var ShowHeader = true;
                PropertyInfo[] properties = stories.First().GetType().GetProperties();
                List<string> headerNames = properties.Select(prop => prop.Name).ToList();                
                var wb = new XLWorkbook();
                var ws = wb.Worksheets.Add("Subscribers");
                if (ShowHeader)
                {
                    for (int i = 0; i < headerNames.Count; i++)                    
                        ws.Cell(1, i + 1).Value = headerNames[i];
    
                    ws.Cell(2, 1).InsertData(stories);
                }
                else
                {
                    ws.Cell(1, 1).InsertData(stories);
                }
    
                wb.SaveAs(@"C:\Testing\yourExcel.xlsx");
            }
    

    【讨论】:

      【解决方案3】:

      对于桌面应用程序

          public static void WriteListToExcel<T>(List<T> list, string fulllPath)
          {
              try
              {
                  List<string> result = new List<string>();
                  result.Add(String.Join(String.Empty, typeof(T).GetProperties().Select(i => String.Format("{0}\t", i.Name)))); // Headers
                  result.AddRange(list.Select(i => String.Join("\t", i.GetType().GetProperties().Select(t => t.GetValue(i, null))))); // Lines
                  File.WriteAllLines(fulllPath, result);
              }
              catch (Exception e)
              {
                  // Error do what you want....
              }
          }
      

      对于网络应用

          public static void WriteListToExcel<T>(HttpResponseBase Response, List<T> list, string fileName)
          {
              try
              {
                  Response.Clear();
                  Response.AddHeader("content-disposition", String.Format("attachment;filename={0}.xls", fileName));
                  Response.Charset = String.Empty;
                  Response.Cache.SetCacheability(HttpCacheability.NoCache);
                  Response.ContentType = "application/vnd.ms-excel";
      
                  List<string> result = new List<string>();
                  result.Add(String.Format("{0}\n", String.Join(String.Empty, typeof(T).GetProperties().Select(i => String.Format("{0}\t", i.Name))))); // Headers
                  result.AddRange(list.Select(i => String.Format("{0}\n",String.Join("\t", i.GetType().GetProperties().Select(t => t.GetValue(i, null)))))); // Lines 
                  result.ForEach(i => Response.Write(i));
      
                  Response.Flush();
                  Response.End();
              }
              catch (Exception e)
              {
                  // Error..
              }
          }
      

      【讨论】:

      • 我实际上会在末尾添加Response.Flush() 以确保所有内容都正确呈现到excel
      • 这不是将其导出为 excel 格式,而是将其导出为一个制表符分隔的文件,您在该文件上添加了 .xls 扩展名。当然,这会告诉 Windows 尝试在 Excel 中打开它,但它不是 Excel 文档。
      • 感谢解决方案很整洁!我不需要安装 Excel 和昂贵的 COM 组件调用等。
      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多