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


当前回答

这里有一个完全免费的C#库,它允许您使用OpenXML库从DataSet、DataTable或List<>导出到真正的Excel 2007.xlsx文件中:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

免费提供完整的源代码以及说明和演示应用程序。

将此类添加到应用程序后,只需一行代码即可将DataSet导出到Excel:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

没有比这更简单的了。。。

它甚至不需要Excel出现在您的服务器上。

其他回答

我成功地使用了以下开源项目:

用于OOXML格式的ExcelPackage(Office 2007)XLS格式的NPOI(Office 2003)。NPOI 2.0(Beta版)也支持XLSX。

看看我的博客帖子:

在C中创建Excel电子表格.XLS和.XLSX#

带有Excel表格和动态图表的NPOI

一些第三方组件供应商,如Infregistics或Syncfusion,提供了非常好的Excel导出功能,不需要安装Microsoft Excel。

由于这些供应商还提供高级UI网格组件,如果您希望excel导出的样式和布局模拟应用程序用户界面中网格的当前状态,这些组件特别方便。

如果您的导出是在服务器端执行的,重点是要导出的数据,并且没有到UI的链接,那么我会选择一个免费的开源选项(例如ExcelLibrary)。

我以前参与过一些试图在Microsoft Office套件上使用服务器端自动化的项目。根据这一经验,我强烈建议反对这种做法。

从C#创建Excel文件的最简单和最快捷的方法是使用OpenXMLProductivity工具。OpenXMLProductivity工具随OpenXMLSDK安装一起提供。该工具将任何Excel文件反向工程为C#代码。然后可以使用C#代码重新生成该文件。

所涉及的流程概述如下:

使用该工具安装OpenXMLSDK。使用具有所需外观的最新Excel客户端创建Excel文件。将其命名为DesiredLook.xlsx。使用该工具打开DesiredLook.xlsx并单击顶部附近的Reflect Code按钮。文件的C#代码将在工具的右窗格中生成。将其添加到C#解决方案中,并生成具有所需外观的文件。

另外,此方法适用于任何Word和PowerPoint文件。作为C#开发人员,您将根据需要对代码进行更改。

我在github上开发了一个简单的WPF应用程序,将在Windows上运行。有一个名为GeneratedClass的占位符类,您可以在其中粘贴生成的代码。如果您返回文件的一个版本,它将生成如下excel文件:

public class GridViewExportUtil
{
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                //  Create a form to contain the grid
                Table table = new Table();

                //  add the header row to the table
                if (gv.HeaderRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                    table.Rows.Add(gv.HeaderRow);
                }

                //  add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    GridViewExportUtil.PrepareControlForExport(row);
                    table.Rows.Add(row);
                }

                //  add the footer row to the table
                if (gv.FooterRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                    table.Rows.Add(gv.FooterRow);
                }

                //  render the table into the htmlwriter
                table.RenderControl(htw);

                //  render the htmlwriter into the response
                HttpContext.Current.Response.Write(sw.ToString());
                HttpContext.Current.Response.End();
            }
        }
    }

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    private static void PrepareControlForExport(Control control)
    {
        for (int i = 0; i < control.Controls.Count; i++)
        {
            Control current = control.Controls[i];
            if (current is LinkButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            }
            else if (current is ImageButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            }
            else if (current is HyperLink)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            }
            else if (current is DropDownList)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            }
            else if (current is CheckBox)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            }

            if (current.HasControls())
            {
                GridViewExportUtil.PrepareControlForExport(current);
            }
        }
    }
}

嗨,这个解决方案是将网格视图导出到excel文件中,这可能会帮助您

在我的项目中,我使用一些.net库来提取Excel文件(.xls和.xlsx)

为了导出数据,我经常使用rdlc。

要修改我使用的excel文件(尝试设置空白单元格A15时的示例代码):

关闭的XML

        //Closed XML
        var workbook = new XLWorkbook(sUrlFile); // load the existing excel file
        var worksheet = workbook.Worksheets.Worksheet(1);
        worksheet.Cell("A15").SetValue("");
        workbook.Save();

铁杆XL

       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", "");

天冬氨酸

            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;