C#使用FreeSpire.XLS创建Excel

前言

对于使用C#程序生成Excel文件,我经历了以下几个阶段,强烈推荐使用Spire.XLS:

  1. Microsoft.Office.Interop.Excel.dll
  2. EPPlus.dll
  3. Spire.XLS.dll

对于Spire.XLS的免费版本,Free Spire.XLS有以下限制,但一般够用了,其官网说明如下

免费 Spire.XLS 感兴趣。它是完全免费的,没有任何警告消息供您商业和个人使用。
免费版限于每个工作簿5张和每张200行。在读取或写入XLS或PDF文件期间会强制执行此限制。
从Free Spire.XLS v7.8开始,加载和保存.xlsx文件格式没有任何限制。
将Excel文件转换为PDF文件时,只能获取PDF文件的前3页。

DLL引用

使用NuGet搜索FreeSpire.XLS安装到项目即可

我们用下图的一个表格,来做示例代码操作

代码如下

using Spire.Xls;
using Spire.Xls.Charts;
using System;
using System.Data;
using System.Drawing;

namespace Spire_XLS_Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义Excel保存路径,在临时目录中
            string strFileName = System.IO.Path.GetTempPath() + "DEMO_" + DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".xlsx";

            //实例化Excel
            Workbook book = new Workbook();
            book.DefaultFontName = "Arial";
            Worksheet sheet1 = book.Worksheets[0];
            Worksheet sheet2 = book.Worksheets[1];
            //删除自动创建的Sheet3
            book.Worksheets[2].Remove();

            //加载数据
            DataTable dtMyData = GetMyData();

            //保存数据
            sheet1.Range[2, 2].Value2 = "我的销售额 2019";
            sheet1.Range[3, 2].Value2 = "月份";
            sheet1.Range[3, 3].Value2 = "销售额";
            sheet1.Range[3, 4].Value2 = "利润率";

            for (int i = 0; i < dtMyData.Rows.Count; i++)
            {
                sheet1.Range[4 + i, 2].Value2 = dtMyData.Rows[i]["月份"];
                sheet1.Range[4 + i, 2].NumberFormat = "yyyy年mm月";       //设置文本格式为日期
                sheet1.Range[4 + i, 3].Value2 = dtMyData.Rows[i]["销售额"];
                sheet1.Range[4 + i, 3].NumberFormat = "0,0";            //设置文本格式为金额(千分位)
                sheet1.Range[4 + i, 4].Value2 = dtMyData.Rows[i]["利润率"];
                sheet1.Range[4 + i, 4].NumberFormat = "0.00%";          //设置文本格式为百分比
            }

            //Style设置
            sheet1.Range[2, 2, 2, 4].Merge();
            sheet1.Range[2, 2, 2, 4].Style.Font.Size = 16;
            sheet1.Range[2, 2, 2, 4].Style.Font.IsBold = true;
            sheet1.Range[2, 2, 2, 4].Style.Font.IsItalic = true;
            sheet1.Range[2, 2, 2, 4].Style.Color = Color.FromArgb(255, 192, 0);
            sheet1.Range[3, 2, 3, 4].Style.Color = Color.GreenYellow;
            sheet1.Range[3, 2, 3, 4].HorizontalAlignment = HorizontalAlignType.Center;

            //边框设置
            for (int iRow = 3; iRow <= dtMyData.Rows.Count + 3; iRow++)
            {
                for (int iCol = 2; iCol <= 4; iCol++)
                {
                    sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                    sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                    sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                    sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                }
            }
            //自适应列
            for (int i = 2; i <= 4; i++)
            {
                sheet1.AutoFitColumn(i);
            }
            //自适应行
            sheet1.AutoFitRow(2);

            //产生Chart
            Chart chart1 = sheet1.Charts.Add();
            
            chart1.DataRange = sheet1.Range[3, 2, dtMyData.Rows.Count + 3, 4];
            chart1.SeriesDataFromRange = false;
            chart1.LeftColumn = 6;
            chart1.RightColumn = 15;
            chart1.TopRow = 2;
            chart1.BottomRow = 20;

            ChartSerie cs1 = chart1.Series[0];
            ChartSerie cs2 = chart1.Series[1];
            cs1.SerieType = ExcelChartType.ColumnClustered; //柱形图
            cs2.SerieType = ExcelChartType.LineMarkers; //折线图
            chart1.SecondaryCategoryAxis.IsMaxCross = true;
            //使用副坐标轴
            cs2.UsePrimaryAxis = false;
            //图表标题
            chart1.ChartTitle = "我的销售额 2019";

            //透视表
            PivotCache pivotCache = book.PivotCaches.Add(sheet1.Range[3, 2, dtMyData.Rows.Count + 3, 4]);
            PivotTable pivotTable = sheet2.PivotTables.Add("2019Summry", sheet2.Range["A1"], pivotCache);
            //设置行列值
            pivotTable.PivotFields[0].Axis = AxisTypes.Row;
            pivotTable.PivotFields[1].Axis = AxisTypes.Column;
            pivotTable.PivotFields[2].Axis = AxisTypes.Data;
            //添加汇总
            pivotTable.DataFields.Add(pivotTable.PivotFields[2], "Demo Pivot", SubtotalTypes.Sum);
            //设置标题
            pivotTable.Options.RowHeaderCaption = "日期";
            pivotTable.Options.ColumnHeaderCaption = "销售额";
            //设置透视表样式
            pivotTable.Options.RowLayout = PivotTableLayoutType.Tabular;
            
            //保存Excel,主要要选择相应的Excel版本
            book.SaveToFile(strFileName, ExcelVersion.Version2013);

            //打开生成的Excel文件
            System.Diagnostics.Process.Start(strFileName);

        }

        //模拟数据
        static DataTable GetMyData()
        {
            DataTable dt = new DataTable("我的销售额");
            dt.Columns.Add("月份", typeof(DateTime));
            dt.Columns.Add("主打产品", typeof(string));
            dt.Columns.Add("销售额", typeof(double));
            dt.Columns.Add("利润率", typeof(double));

            DataRow dr;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 1, 1); dr["主打产品"] = "手机"; dr["销售额"] = 21469; dr["利润率"] = 0.32;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 2, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 36224; dr["利润率"] = 0.45;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 3, 1); dr["主打产品"] = "电视"; dr["销售额"] = 24619; dr["利润率"] = 0.35;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 4, 1); dr["主打产品"] = "手机"; dr["销售额"] = 35478; dr["利润率"] = 0.36;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 5, 1); dr["主打产品"] = "电视"; dr["销售额"] = 37168; dr["利润率"] = 0.48;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 6, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 37034; dr["利润率"] = 0.36;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 7, 1); dr["主打产品"] = "手机"; dr["销售额"] = 43200; dr["利润率"] = 0.29;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 8, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 19159; dr["利润率"] = 0.36;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 9, 1); dr["主打产品"] = "电视"; dr["销售额"] = 30971; dr["利润率"] = 0.34;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 10, 1); dr["主打产品"] = "手机"; dr["销售额"] = 29757; dr["利润率"] = 0.64;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 11, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 13180; dr["利润率"] = 0.45;
            dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 12, 1); dr["主打产品"] = "电视"; dr["销售额"] = 15730; dr["利润率"] = 0.25;
            return dt;
        }

    }
}

重要说明:

引用Spire.XLS时,必须同时引用Spire.Pdf和Spire.License,或将dll文件放在同一目录

解决方案源代码可到资源区下载

其他关于Spire.Xls的操作:

跨列居中:(显示效果类似合并单元格,但是实际并没有合并)

sheet1.Range[2, 3, 2, 6].HorizontalAlignment = HorizontalAlignType.CenterAcrossSelection;

设置折叠分组:

sheet1.GroupByRows(iStartRow, iEndRow, true);

设置冻结窗口:

//冻结首行
sheet1.FreezePanes(2, 1);

//冻结首列
sheet1.FreezePanes(1, 2);

透视表刷新:

//手动刷新数据
pt.CalculateData();
//设置打开时自动刷新数据
pt.Cache.IsRefreshOnLoad = true;

设置文档属性:

//设置摘要
book.DocumentProperties.Company = "凯神科技";
book.DocumentProperties.Author = "凯神Jump";
book.DocumentProperties.Title = "财务报表";
//设置自定义属性
book.CustomDocumentProperties.Add("联系电话", "12345678");

搜索替换

if (sheet.FindString("#LotNo#", false, false) != null)
{
    sheet.Replace("#LotNo#","AA00001");
}

查找单元格

CellRange[] mycells = sheet.FindAllString("mydemostring", False, False);

插入图片

sheet.Pictures.Add(1, 1, bitmap);

隐藏行

sheet.HideRow(1);

 插入行

sheet.InsertRow(3, 100, Spire.Xls.InsertOptionsType.FormatAsAfter);
//3:在第3行后面插入,100:插入100行,FormatAsAfter:格式同后面的行,不填此参数则默认样式

设置外边框

sheet.Range[2,2,8,8].BorderAround(LineStyleType.Thin);

激活单元格

sheet.Range["A1"].Activate();

激活Worksheet

sheet.Activate();

隐藏网格线

sheet.GridLinesVisible = false;

有时候如果读取的模板文件中有公式,但是更新数据后,公式字段显示不更新,使用以下代码

foreach( Worksheet sheet in book.Worksheets)
{
    sheet.ReparseFormula();
    //在有一次使用上面的方法时,出现了将公式清除的情况,后来使用了下面的方法以刷新公式,生效了
    sheet.CalculateAllValue();
    //使用book.CalculateAllValue();也是无效
}

Excel根据列号转string,如:sheet.Range[28,1] --> sheet.Range["C1"]

public string ChangeColumnNoToStr(int num)
{
    if (num <= 26)
    {
        return Convert.ToChar(num + 65 - 1).ToString();
    }
    else
    {
        int x, y;
        x = 0;
        y = 0;
        x = num / 26;
        y = num % 26;
        if (y == 0)
        {
            return Convert.ToChar(x + 65 - 2).ToString() + "Z";
        }
        else
        {
            return Convert.ToChar(x + 65 - 1).ToString() + Convert.ToChar(y + 65 - 1).ToString();
        }
    }
}

源码下载

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Free Spire.XLS for .NET 是e-iceblue公司开发的一款支持对所有Excel格式类型文件进行操作的.NET 控件。它适用于任何类型的应用程序比如ASP.NET Web应用程序或者Windows桌面应用程序。Spire.XLS for .NET允许开发人员创建和管理Excel,而不需要安装Microsoft Excel或者Microsoft Office。相比Microsoft,Spire.XLS for .NET对于开发人员来说是一个更好的选择 - 自动化,安全,稳定,可扩展性延伸,速度快,价格便宜和功能强大。 通过使用Free Spire.XLS for .NET,开发人员可以快速方便的查看,生成,读写以及自定义编辑Excel文件。Spire.XLS for .NET支持Excel 97-2003, Excel 2007, Excel 2010 and Excel 2013。它还支持C#, VB.NET, ASP.NET和 ASP.NET MVC编程语言 作为一款专业,强大,方便易用的控件,Spire.XLS for .NET有一下主要功能: 新建Excel文件,编辑已有的Excel文件,多种保存Excel方式,设置Excel文件属性,文件打印设置,合并,拆分或者拷贝单元格,支持对Excel文件加锁或者加密保护。 Spire.XLS for .NET支持把数据从数据库导出到Excel工作表,或者把数据从Excel数据导入到数据库。 Spire.XLS for .NET 提供强大的功能为开发者设置单元格格式。这次格式化数字,文字缩进,定位调整,设置单元格边线,单元格填充以及保护等。 开发人员可以轻松的利用Spire.XLS for .NET向Excel文件里面写入内容,包括超过530多种的公式,70多种表格,支持插入图片,不同类型的文字,链接,注释甚至VBA等。 Spire.XLS for .NET 还允许开发人员将Excel文件转换成PDF, HTML, CSV, Text, XML以及图片格式。 注:下载包含有Spire.xls.dll文件以及部分Demo, 你可以调用DLL并参照Demo提供的代码处理Excel文档。
Free Spire.XLS for .NET 是 Spire.XLS for .NET 的免费版本,无需购买即可用于个人或商业用途。使用 Free Spire.XLS for .NET,开发人员可以在 .NET 应用程序中快速对 Excel 文档进行各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档以及对 Excel 文档进行转换等。Free Spire.XLS for .NET 是 Spire.XLS for .NET 的免费版本,无需购买即可用于个人或商业用途。使用 Free Spire.XLS for .NET,开发人员可以在 .NET 应用程序中快速对 Excel 文档进行各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档以及对 Excel 文档进行转换等。 主要功能如下: 1.100% 独立的 .NET 组件,无需 Microsoft Office Automation 2.强大的,高质量的 Excel 文件转换功能。支持将 Excel 文档快速高效地转换为多种常见的格式,如 XML,Text,PDF 和图片等。 3.使用全面的工作簿设计器创建 Excel 报表。支持开发人员新建 Excel 工作簿,从文件流或文件夹加载工作簿。还可以将工作薄保存到磁盘, 文件流或 Web Response,同时提供了多种安全功能,包括 Excel 加密/解密,单元格隐藏/取消隐藏,工作表锁定/解锁。 4.自由操作工作表。允许开发人员使用 C#、VB.NET 或 ASP.NET 来创建、添加、删除、重命名、编辑和移动工作表,开发人员还可以在多个充满数据的工作表之间进行复制、调换和合并操作。这个专业的 .NET Excel 类库嵌入了很多灵活显示工作表的选项,包括分页符,缩放设置,冻结窗口,页眉/页脚,打印 Excel 文件,打印页面尺寸和打印区域等。 5.在运行时轻松操作单元格和 Excel 计算引擎。开发人员可以在运行时使用 C#、VB.NET 或 ASP.NET 轻松地操作 Excel 单元格,计算公式值。该高速、可扩展的 Excel 计算引擎与 Excel 97-2003/2007/2010 等兼容。同时该组件支持设置单元格样式,如单元格的合并/拆分,文字环绕/取消环绕,文本排列和旋转、边框、锁定/解除等。字体格式,如设置字体类型、大小、颜色、粗体、斜体、删除线、下划线等等。条件格式,文本搜索和替换,过滤和数据验证等操作都可以轻松的应用到单元格中。 6.图表、数据和其它元素。提供了一组丰富的图表,如饼状图,条形图,柱形图,折线图和雷达图等。此外,它支持使用 C#、VB.NET 或 ASP.NET 在数据库和 Excel 之间进行数据传输,支持超链接和模板,支持创建和获取数据透视表。
Spire.XLS 是一个 C#Excel 处理库,它提供了读取和写入 Excel 文件的功能。你可以使用 Spire.XLS 来操作 Excel 文件,包括读取、写入、创建、修改和格式化等操作。 要使用 Spire.XLS,首先需要在你的项目中引入 Spire.XLS 的命名空间: ```csharp using Spire.Xls; ``` 然后,你可以使用以下代码示例来读取和写入 Excel 文件: 读取 Excel 文件: ```csharp // 创建一个 Workbook 对象 Workbook workbook = new Workbook(); // 加载 Excel 文件 workbook.LoadFromFile("path/to/your/excel/file.xlsx"); // 获取第一个工作表 Worksheet sheet = workbook.Worksheets[0]; // 遍历工作表中的单元格 foreach (CellRange range in sheet.Cells) { // 获取单元格的值 string value = range.Value; // 处理单元格的值 // ... } // 关闭 workbook 对象 workbook.Close(); ``` 写入 Excel 文件: ```csharp // 创建一个 Workbook 对象 Workbook workbook = new Workbook(); // 创建一个工作表 Worksheet sheet = workbook.CreateEmptySheet(); // 设置单元格的值 sheet.Range["A1"].Value = "Hello"; sheet.Range["B1"].Value = "World"; // 保存为 Excel 文件 workbook.SaveToFile("path/to/save/excel/file.xlsx"); // 关闭 workbook 对象 workbook.Close(); ``` 这只是 Spire.XLS 的一些基本用法示例,你可以根据具体需求进行更多操作,如格式化单元格、合并单元格、设置样式等。详细的 API 文档可以在 Spire.XLS 的官方网站或官方文档中找到。 希望这能帮到你!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值