如何在不安装 Microsoft Office 的情况下使用 C# 创建 Excel (.XLS 和 .XLSX) 文件?

2156

我如何在不需要安装Excel的计算机上使用C#创建Excel电子表格?


68
“不需要安装Excel”并不意味着不专业。这是关于依赖性的问题。原始问题的文本为:“理想情况下,我希望使用开源代码,这样我就不必添加任何第三方依赖项,并且我想避免直接使用Excel创建文件(使用OLE自动化)。”不幸的是,问题被大幅简化了。 - Tony
10
假设您想要做一些不使用库或外部代码的事情,我无法对 xls 文件进行说明,但对于 xlsx 文件,为什么不从一个现有的文件开始,将其重命名为 zip 文件并探索其内容呢?进行一点反向工程将会告诉您很多信息。各个文件夹和子文件夹中有几个不同的 xml 文件和 rels 文件。尝试探索一下,看看是否可以复制它,或者找到关于各种 xml 命名空间/模式的文档。 - Alexander Ryan Baggett
48个回答

1
在我的项目中,我使用一些 .net 库来提取 Excel 文件(包括 .xls 和 .xlsx)。
为了导出数据,我经常使用 rdlc
为了修改 Excel 文件,我使用以下示例代码来设置空白单元格 A15: ClosedXML
        //Closed XML
        var workbook = new XLWorkbook(sUrlFile); // load the existing excel file
        var worksheet = workbook.Worksheets.Worksheet(1);
        worksheet.Cell("A15").SetValue("");
        workbook.Save();

IronXL

       string sUrlFile = "G:\\ReportAmortizedDetail.xls";
        WorkBook workbook = WorkBook.Load(sUrlFile);
        WorkSheet sheet = workbook.WorkSheets.First();
        //Select cells easily in Excel notation and return the calculated value
        sheet["A15"].First().Value = "";
        sheet["A15"].First().FormatString = "";

        workbook.Save();
        workbook.Close();
        workbook = null;

SpireXLS (当我尝试使用该库时,它会打印附加工作表以提供我们使用试用版库的信息)

            string sUrlFile = "G:\\ReportAmortizedDetail.xls";
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(sUrlFile);
            //Get the 1st sheet
            Worksheet sheet = workbook.Worksheets[0];
            //Specify the cell range
            CellRange range = sheet.Range["A15"];
            //Find all matched text in the range
            CellRange[] cells = range.FindAllString("hi", false, false);
            //Replace text
            foreach (CellRange cell in range)
            {
                cell.Text = "";
            }
            //Save
            workbook.Save();

Jet Oledb

    //ExcelTool Class
    public static int ExcelUpdateSheets(string path, string sWorksheetName, string sCellLocation, string sValue)
    {
        int iResult = -99;
        String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO'";
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();
        OleDbCommand objCmdSelect = new OleDbCommand("UPDATE [" + sWorksheetName + "$" + sCellLocation + "] SET F1=" + UtilityClass.ValueSQL(sValue), objConn);
        objCmdSelect.ExecuteNonQuery();
        objConn.Close();

        return iResult;
    }

使用方法:

    ExcelTool.ExcelUpdateSheets(sUrlFile, "ReportAmortizedDetail", "A15:A15", "");

Aspose

            var workbook = new Aspose.Cells.Workbook(sUrlFile);
            // access first (default) worksheet
            var sheet = workbook.Worksheets[0];
            // access CellsCollection of first worksheet
            var cells = sheet.Cells;
            // write HelloWorld to cells A1
            cells["A15"].Value = "";
            // save spreadsheet to disc
            workbook.Save(sUrlFile);
            workbook.Dispose();
            workbook = null;

1
我想知道为什么没有人建议使用PowerShell和免费的ImportExcel模块;它可以轻松创建XML-Excel文件(xlsx)。

当从像SQL Server这样的数据库创建Excel表格时,特别容易使用...


FYI,XLSX 扩展名与 XML 没有任何关系,它只是 XLS 文件扩展名的现代版(Office 2007+)。 - TylerH
1
@TylerH 不过它们是基于XML的。XLSX文件是XML文件的.zip文件,与OpenOffice文件格式的想法相同。 - Rup
@Rup 是的,这些文件是XML数据的专有包装器。但这并不意味着这些文件是“XML-Excel”文件。它们只是Excel文件。 - TylerH

1

之前我使用NPOI创建了一个DLL库。使用起来非常简单:

IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople); 
MemoryStream memory = engine.Export();

您可以在这里阅读更多相关编程内容。

顺便提一下,它是100%的开源。请自由使用、编辑和分享;)


1
为了将xls格式的文件保存为xlsx格式,我们只需要从Microsoft.Office.Interop.Excel库中调用SaveAs方法。该方法需要大约16个参数,其中一个是文件格式。
Microsoft文档:这里 SaveAs方法参数 我们需要传递的对象类似于
wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)

这里的51是XLSX的枚举值。
对于不同文件格式的SaveAs,您可以参考xlFileFormat

这里也有一个关于使用Office Interop的旧答案。 - Rup

1
如果您从代码中创建数据表或数据网格视图,您可以使用这种简单的方法保存所有数据。这种方法并不推荐,但是它可以100%工作,即使您的计算机上没有安装MS Excel。
try
 {
  SaveFileDialog saveFileDialog1 = new SaveFileDialog();
  saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls";
  saveFileDialog1.FileName = "Employee Details.xls";
  if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  {
  string fname = saveFileDialog1.FileName;
  StreamWriter wr = new StreamWriter(fname);
  for (int i = 0; i <DataTable.Columns.Count; i++)
  {
  wr.Write(DataTable.Columns[i].ToString().ToUpper() + "\t");
  }
  wr.WriteLine();

  //write rows to excel file
  for (int i = 0; i < (DataTable.Rows.Count); i++)
  {
  for (int j = 0; j < DataTable.Columns.Count; j++)
  {
  if (DataTable.Rows[i][j] != null)
  {
  wr.Write(Convert.ToString(getallData.Rows[i][j]) + "\t");
  }
   else
   {
   wr.Write("\t");
   }
   }
   //go to next line
   wr.WriteLine();
   }
   //close file
   wr.Close();
   }
   }
   catch (Exception)
   {
    MessageBox.Show("Error Create Excel Sheet!");
   }

0
我想用C#创建xlsx(Excel)文件的回答中重新发布:
你可以使用NPOI库来创建Excel文档。它不需要安装Office,也不使用Interop / COM+。它还支持.NET Core。
using var workbook = new XSSFWorkbook();

var sheet = workbook.CreateSheet("Sheet1");

int rowIndex = 0;

var row = sheet.CreateRow(rowIndex++);
int cellIndex = 0;
row.CreateCell(cellIndex++).SetCellValue("ID");
row.CreateCell(cellIndex++).SetCellValue("Name");

var row = sheet.CreateRow(rowIndex++);
cellIndex = 0;
row.CreateCell(cellIndex++).SetCellValue("1");
row.CreateCell(cellIndex++).SetCellValue("One");

var row = sheet.CreateRow(rowIndex++);
cellIndex = 0;
row.CreateCell(cellIndex++).SetCellValue("2");
row.CreateCell(cellIndex++).SetCellValue("Two");


string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;
string xlsxPath = Path.Combine(path, $"vdfgdfg.xlsx");

using var fileStream = new FileStream(xlsxPath, FileMode.Create, FileAccess.Write);
workbook.Write(fileStream);

链接:
- NuGet:[https://www.nuget.org/packages/NPOI](https://www.nuget.org/packages/NPOI) - 相当不错的介绍(HTTP!):[http://www.independent-software.com/introduction-to-npoi.html](http://www.independent-software.com/introduction-to-npoi.html) - 入门指南:[https://github.com/nissl-lab/npoi/wiki/Getting-Started-with-NPOI](https://github.com/nissl-lab/npoi/wiki/Getting-Started-with-NPOI)

-2

看这里,无需第三方库,你可以使用以下方法将 DataTable 数据直接导出为 Excel 文件。

var dt = "your code for getting data into datatable";
            Response.ClearContent();
            Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
            Response.ContentType = "application/vnd.ms-excel";
            string tab = "";
            foreach (DataColumn dataColumn in dt.Columns)
            {
                Response.Write(tab + dataColumn.ColumnName);
                tab = "\t";
            }
            Response.Write("\n");
            int i;
            foreach (DataRow dataRow in dt.Rows)
            {
                tab = "";
                for (i = 0; i < dt.Columns.Count; i++)
                {
                    Response.Write(tab + dataRow[i].ToString());
                    tab = "\t";
                }
                Response.Write("\n");
            }
            Response.End();

4
生成一个以制表符分隔的文件,并将其保存为 .XLS 扩展名,以便由 Excel 打开。这不是真正的 Excel 文件,您无法包含格式等信息。这里有类似的答案尝试使用 HTML 和错误的扩展名来达到同样的效果。 - Rup

-5
我正在使用以下代码创建Excel 2007文件,该代码可以创建文件并在其中写入内容。但是,当我打开文件时,它会提示错误,说Excel无法打开文件,因为文件可能已损坏或文件扩展名不兼容。但是,如果我将文件扩展名改为.xls,它就可以正常工作。
for (int i = 0; i < TotalFile; i++)
{
    Contact.Clear();
    if (innerloop == SplitSize)
    {
        for (int j = 0; j < SplitSize; j++)
        {
            string strContact = DSt.Tables[0].Rows[i * SplitSize + j][0].ToString();
            Contact.Add(strContact);
        }
        string strExcel = strFileName + "_" + i.ToString() + ".xlsx";
                         File.WriteAllLines(strExcel, Contact.ToArray());
    }
}

也请参考链接

http://dotnet-magic.blogspot.in/2011/10/createformat-excel-file-from-cnet.html


2
这完全取决于你的Contact类,而你并没有告诉我们它是什么。如果它适用于xls,则很有可能你实际上正在编写HTML,而不是真正的Excel文件。而且你的链接正在使用interop,正如上面提到的,不应该在服务器端使用,并且在填充大表格时可能会变慢。 - Rup
1
联系人是链表而不是类。声明一个链表并使用它,因为我不知道数据的大小,所以使用了链表。 - saurabh27
1
哦,所以你正在生成一个每行一个项目的纯文本文件?所以Excel将其视为没有逗号的CSV文件? - Rup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接