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/

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

  • 相关阅读:
    常见排序算法及其C++实现
    Arc Engine二次开发——弹窗进行属性查询
    Python:Shapefile矢量转化为GeoJSON格式
    Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
    Java调用Python相关问题:指定python环境、传入参数、返回结果
    标准WPS框架下的空间信息处理服务部署方法
    AE开发—利用IQueryFilter接口进行属性查询
    Java调用Javascript、Python算法总结
    百度地图爬虫——获取某区域所有中学附近的网吧数据
    Python中使用面状矢量裁剪栅格影像,并依据Value值更改矢量属性
  • 原文地址:https://www.cnblogs.com/landeanfen/p/5906077.html
Copyright © 2011-2022 走看看