zoukankan      html  css  js  c++  java
  • C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有(二)

    正文

    前言:上篇 C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有(一) 介绍了下组件的两个功能,说不上特色,但确实能解决我们项目中的一些实际问题,这两天继续研究了下这个组件,觉得有些功能用起来还是挺方便的,这篇继续来看看Spire.XLS的一些其他功能,说不定有你需要的呢~~

    本文原创地址:http://www.cnblogs.com/landeanfen/p/5906077.html

    一、基础入门

    1、新建Workbook

     Spire.XLS提供了多种方式创建Workbook对象

    1.1、新建空的Workbook

    复制代码
    //新建Workbook
    Workbook workbook = new Workbook();
    //得到第一个Sheet页
    Worksheet sheet = workbook.Worksheets[0];
    
    //给A2这个单元格设置值
    sheet.Range["A2"].Text = "你好,Jim" ;
    
    //保存到物理路径
    var strFullName = @"D:DataUpload" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    workbook.SaveToFile(strFullName);
    复制代码

    就这么简单生成一个Excel文件

    1.2、根据物理路径生成Workbook

    复制代码
    //新建Workbook
    Workbook workbook = new Workbook();
    //将当前路径下的文件内容读取到workbook对象里面
    workbook.LoadFromFile(@"D:DataUploadExport20160926114559.xlsx");
    
    //得到第一个Sheet页
    Worksheet sheet = workbook.Worksheets[0];
    //给A2这个单元格设置值
    sheet.Range["C5"].Text = "你好,Jim" ;
    
    //保存到物理路径
    var strFullName = @"D:DataUpload" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    workbook.SaveToFile(strFullName,ExcelVersion.Version2010);
    复制代码

    1.3、根据文件流生成Workbook

    上篇我们演示过多次,对于Web里面的文件上传,多用此方法。

    //得到当前请求的文件
    var oFile = Request.Files["txt_file"];
    
    //根据当前的文件流生成Workbook对象
    Workbook book = new Workbook();
    book.LoadFromStream(oFile.InputStream);

    1.4、根据Excel模板生成Workbook

    这种用法适用于项目需要使用Excel模板的时候,比如我们项目需要导出的每一个Excel都适用如下模板:

    那么,我们每次生成Excel的时候可以根据该模板去创建Workbook

    //新建Workbook
    Workbook workbook = new Workbook();
    //根据模板生成Workbook
    workbook.LoadTemplateFromFile(@"D:DataUploadTemplate.xlsx");

    这样得到的Excel文件将会自动套用该模板样式。

    2、读写Workbook

    2.1、根据单元格的名称框来读写Excel

    关于Workbook的读写,上文已经提供了一种方式,形如:

    sheet.Range["C5"].Text = "你好,Jim" ;

    这样就能给C5单元格赋值,如果是取值,可以直接使用同样的方式。当然,除了Text字符串的内容,组件还提供了NumberValue、DateTimeValue、BooleanValue等属性,用于读写数字、时间、bool类型的值。

    当然,Range除了支持基础的单元格名称框来读写值之外,它还提供了给某一个区域的文本框赋值的功能。比如

    sheet.Range["C5:E6"].Value = "你好,Jim" ;

    这一句表示给C5-E6这一区域的文本框统一赋值。得到结果如下:

    如果需要操作当前区域的所有单元格,可以这样:

    var columes = sheet.Range["C5:E6"].Columns ;
    foreach (var column in columes)
    { }

    2.2、根据单元格的行列索引来读写Excel

    除了上面的方式,组件还支持通过行列的索引去给单元格取赋值。

    sheet.Range[1, 1].Text = "部门名称";

    以上一句表示给第一个行第一列单元格赋值。

    3、保存Workbook

    关于Excel的保存,组件同样提供了多种方式。

    3.1、直接保存的方式:SaveToFile()

    var strFullName = @"D:DataUpload" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    workbook.SaveToFile(strFullName);

    值得一提的是,SaveToFile还支持保存不同版本的Excel,来看这个重载

    public void SaveToFile(string fileName, ExcelVersion version);

    ExcelVersion是一个枚举类型,定义了各种不同版本的Excel:

    复制代码
    public enum ExcelVersion
        {
            // 摘要: 
            //     Represents excel version 2007 xlsb
            Xlsb2007 = 0,
            //
            // 摘要: 
            //     Represents excel version 2010 xlsb
            Xlsb2010 = 1,
            //
            // 摘要: 
            //     OpenOffice Spreadsheet documents
            ODS = 2,
            //
            // 摘要: 
            //     Represents excel version 97-2003.
            Version97to2003 = 3,
            //
            // 摘要: 
            //     Represents excel version 2007
            Version2007 = 4,
            Version2010 = 5,
            //
            // 摘要: 
            //     Represents excel version 2013.
            Version2013 = 6,
        }
    复制代码

    3.2、保存并且转换文件

    上篇介绍Excel转PDF的时候,我们知道组件提供了SaveToPdf()方法直接将Excel保存成为pdf文件,用法如下:

    //保存到物理路径
    var strFullName = @"D:DataUpload" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
    workbook.SaveToPdf(strFullName)

    除了保存成为pdf之外,还支持转换成其他格式:

    保存为image

    var strFullName = @"D:DataUpload" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";
    var image = workbook.SaveAsImage(0, 100, 190);
    image.Save(strFullName);

    SaveAsImage()第一个参数表示需要生成图片的Sheet页的索引;第二、三个参数表示生成图片的X和Y的值。

    保存为xml

    workbook.SaveAsXml(strFullName);

    保存到文件流

    using (var stream = new FileStream(strFullName, FileMode.Create))
    {
        workbook.SaveToStream(stream);
    } 

    二、样式

    1、文本样式

    设置单元格字体样式

    复制代码
    sheet.Range["C5:E6"].Value = "aaabbbccc";
    sheet.Range["C5:E6"].Style.Font.Color = Color.FromArgb(255, 125, 125);//文本颜色
    sheet.Range["C5:E6"].Style.Font.IsBold = true;//字体是否加粗
    sheet.Range["C5:E6"].Style.Font.IsItalic = true;//是否斜体
    sheet.Range["C5:E6"].Style.Font.Underline = FontUnderlineType.Single;//下划线
    sheet.Range["C5:E6"].Style.Font.IsSuperscript = true;//是否呈现为下标
    sheet.Range["C5:E6"].Style.Font.FontName = "华文彩云";//字体名称
    sheet.Range["C5:E6"].Style.Font.Size = 30;//字体大小
    复制代码

    得到结果

    2、单元格样式

    关于单元格样式设置

    复制代码
    sheet.Range["C5:E6"].Style.HorizontalAlignment = HorizontalAlignType.Center;//水平对齐
    sheet.Range["C5:E6"].Style.VerticalAlignment = VerticalAlignType.Center;//垂直对齐
    sheet.Range["C5:E6"].ColumnWidth = 100;//单元格的宽度
    sheet.Range["C5:E6"].RowHeight = 30;//行高
    sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;//边框
    sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
    sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
    sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
    复制代码

    3、表格样式

    下面来一个奇偶行的样式:

    public static void sheetStyle(Workbook book, Worksheet sheet)
            {
                CellStyle oddStyle = book.Styles.Add("oddStyle");
                oddStyle.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                oddStyle.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                oddStyle.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                oddStyle.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                oddStyle.KnownColor = ExcelColors.LightGreen1;
    
                CellStyle evenStyle = book.Styles.Add("evenStyle");
                evenStyle.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                evenStyle.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                evenStyle.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                evenStyle.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                evenStyle.KnownColor = ExcelColors.LightTurquoise;
    
    
                foreach (CellRange range in sheet.AllocatedRange.Rows)
                {
                    if (range.Row % 2 == 0)
                        range.CellStyleName = evenStyle.Name;
                    else
                        range.CellStyleName = oddStyle.Name;
                }
    
                //Sets header style
                CellStyle styleHeader = sheet.Rows[0].Style;
                styleHeader.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                styleHeader.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                styleHeader.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                styleHeader.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                styleHeader.VerticalAlignment = VerticalAlignType.Center;
                styleHeader.KnownColor = ExcelColors.Green;
                styleHeader.Font.KnownColor = ExcelColors.White;
                styleHeader.Font.IsBold = true;
    
                sheet.Columns[sheet.AllocatedRange.LastColumn - 1].Style.NumberFormat = ""$"#,##0";
                sheet.Columns[sheet.AllocatedRange.LastColumn - 2].Style.NumberFormat = ""$"#,##0";
    
                sheet.AllocatedRange.AutoFitColumns();
                sheet.AllocatedRange.AutoFitRows();
    
                sheet.Rows[0].RowHeight = 20;
            }
    SheetStyle()

    效果如下:

    4、富文本编辑框

    除了上面的一些简单样式外,组件还提供了富文本的编辑方式

    复制代码
    ExcelFont fontBold = book.CreateFont();
    fontBold.IsBold = true;
    
    ExcelFont fontUnderline = book.CreateFont();
    fontUnderline.Underline = FontUnderlineType.Single;
    
    ExcelFont fontColor = book.CreateFont();
    fontColor.KnownColor = ExcelColors.Green;
    
    RichText richText = sheet.Range["A1"].RichText;
    richText.Text = "Bold and underlined and colored text";
    richText.SetFont(0, 3, fontBold);
    richText.SetFont(9, 18, fontUnderline);
    richText.SetFont(24, 30, fontColor);
    复制代码

    效果

    当然,这个功能可能在一些特定的场合才会用上。

    三、冻结行列

    组件提供了非常方便冻结行列的功能。

    1、冻结行

    sheet.FreezePanes(2, 1);

    得到结果

    2、冻结列

    sheet.FreezePanes(1, 2);

    得到结果

    代码释疑:这里的两个参数怎么理解,第一个参数rowIndex,第二个参数columnIndex。为什么sheet.FreezePanes(2, 1)能冻结首行?这里博主的理解是这里的参数设置的是开始滑动的行和列。也就是说FreezePanes(2,1)表示从第二行、第一列开始可以滑动,而FreezePanes(1,2)表示从第一行、第二列开始可以滑动。这样是不是会好理解一点。

    四、合并单元格

    关于单元格的合并,组件使用也还算方便。

    var mergecolumn = sheet.Merge(sheet.Range[1, 2], sheet.Range[1, 3]);
    mergecolumn.VerticalAlignment = VerticalAlignType.Center;
    mergecolumn.HorizontalAlignment = HorizontalAlignType.Center;
    mergecolumn.Text = "第一个合并的单元格" ;

    得到结果

    五、选项过滤功能

    组件提供了方便的组件过滤功能

    sheet.AutoFilters.Range = sheet.Range["A1:C1"];

    以上表示对A1到C1这个区域的所有文本框进行过滤。效果如下:

    六、下拉框

    在Excel里面,经常需要用到的一个功能就是在编辑单元格的时候使用下拉框,这样方便了一些特定项的编辑。同样,组件也为我们提供了这个功能

    //下拉框
    CellRange range = sheet.Range["A2:A6"];
    //给E1到E10所有的单元格添加下拉选项,数据来源是A2到A6的值
    sheet.Range["E1:E10"].DataValidation.DataRange = range;

    效果如下:

    七、显示、隐藏行列

    对于行列隐藏也算是一个常用功能,方法如下

    //显示、隐藏行列
    sheet.HideColumn(10);
    sheet.HideRow(8);
    //sheet.ShowColumn(10);
    //sheet.ShowRow(7);

    效果

    八、搜索结果高亮

    foreach (CellRange range in sheet.FindAllString("行政部", true, true))
    {
           range.Style.Color = Color.LawnGreen;
    }

    效果如下

    九、总结

    至此,组件的一些基础功能介绍完毕。当然,这并不是全部,只是博主选的一些觉得或许有用的功能,更多功能可以参考官网文档。

    当然,如果本文能够帮到你,还是希望园友们帮忙推荐,博主下次继续努力!

    本文原创出处:http://www.cnblogs.com/landeanfen/

    欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利

    出处:http://www.cnblogs.com/landeanfen/p/5906077.html

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/mq0036/p/6044944.html
Copyright © 2011-2022 走看看