• C# Aspose.Words 对已有Table行合并


    using Aspose.Words;
    using Aspose.Words.Drawing;
    using Aspose.Words.Tables;

        /// <summary>
            /// 行合并,根据同名合并,同名必须先排序排好
            /// </summary>
            /// <param name="table">要进行行合并的表</param>
            /// <param name="cols">行合并的列,0就第一行</param>
            public static void MergeRows(Table table, int[] cols)
            {
                string tempName = "";
                int tempIndex = 0;
                foreach (var col in cols)
                {
                    tempIndex = 0;
                    for (int i = 1; i < table.Rows.Count; i++)
                    {
                        tempName = table.Rows[i].Cells[col].GetText();
                        tempIndex = i;
    
                        for (int j = i + 1; j < table.Rows.Count; j++)
                        {
                            if (table.Rows[j].Cells[col].GetText() == tempName)
                                tempIndex = j;
                            else break;
                        }
    
                        if (tempIndex != i)
                        {
                            MergeCells(table.Rows[i].Cells[col], table.Rows[tempIndex].Cells[col]);
                            i = tempIndex + 1;
                            if (i >= table.Rows.Count)
                                break;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 合并表格
            /// </summary>
            /// <param name="startCell"></param>
            /// <param name="endCell"></param>
            public static void MergeCells(Cell startCell, Cell endCell)
            {
                Table parentTable = startCell.ParentRow.ParentTable;
    
                // Find the row and cell indices for the start and end cell.
                Point startCellPos = new Point(startCell.ParentRow.IndexOf(startCell), parentTable.IndexOf(startCell.ParentRow));
                Point endCellPos = new Point(endCell.ParentRow.IndexOf(endCell), parentTable.IndexOf(endCell.ParentRow));
                // Create the range of cells to be merged based off these indices. Inverse each index if the end cell if before the start cell.
                Rectangle mergeRange = new Rectangle(Math.Min(startCellPos.X, endCellPos.X), Math.Min(startCellPos.Y, endCellPos.Y), Math.Abs(endCellPos.X - startCellPos.X) + 1,
                Math.Abs(endCellPos.Y - startCellPos.Y) + 1);
    
                foreach (Row row in parentTable.Rows)
                {
                    foreach (Cell cell in row.Cells)
                    {
                        Point currentPos = new Point(row.IndexOf(cell), parentTable.IndexOf(row));
    
                        // Check if the current cell is inside our merge range then merge it.
                        if (mergeRange.Contains(currentPos))
                        {
                            if (currentPos.X == mergeRange.X)
                                cell.CellFormat.HorizontalMerge = CellMerge.First;
                            else
                                cell.CellFormat.HorizontalMerge = CellMerge.Previous;
    
                            if (currentPos.Y == mergeRange.Y)
                                cell.CellFormat.VerticalMerge = CellMerge.First;
                            else
                                cell.CellFormat.VerticalMerge = CellMerge.Previous;
                        }
                    }
                }
            }

    附录完整类

        public enum MarkTypeEnum
        {
            /// <summary>
            /// 中括号 [[]]
            /// </summary>
            DEFAULT,
            /// <summary>
            /// 花括号 {{}}
            /// </summary>
            CURLYBRACES
        }
    
        /// <summary>
        /// word文档操作辅助类
        /// </summary>
        public class AsposeWordHelper
        {
            /// <summary>
            /// Word
            /// </summary>
            private Document _doc;
    
            /// <summary>
            /// 替换自定义文本
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="entity"></param>
            public void Replace<TEntity>(TEntity entity, MarkTypeEnum markTypeEnum)
            {
                var type = entity.GetType();
                var properties = type.GetProperties();
                foreach (var item in properties)
                {
                    _doc.Range.Replace(ConvertMarkType(item.Name, markTypeEnum), item.GetValue(entity, null).ToString(), new Aspose.Words.Replacing.FindReplaceOptions());
                }
            }
    
            /// <summary>
            /// 替换自定义文本
            /// </summary>
            /// <param name="dic"></param>
            public void Replace(Dictionary<string, string> dic, MarkTypeEnum markTypeEnum)
            {
    
                foreach (var item in dic)
                {
                    _doc.Range.Replace(ConvertMarkType(item.Key, markTypeEnum), item.Value, new Aspose.Words.Replacing.FindReplaceOptions());
                }
            }
    
            /// <summary>
            /// 转成标签 [[]] , {{}}
            /// </summary>
            /// <param name="name"></param>
            /// <param name="markTypeEnum"></param>
            /// <returns></returns>
            public static string ConvertMarkType(string name, MarkTypeEnum markTypeEnum = MarkTypeEnum.DEFAULT)
            {
                switch (markTypeEnum)
                {
                    case MarkTypeEnum.CURLYBRACES:
                        return MarkTypeCurlyBraces(name);
                    default:
                        return MarkTypeDefault(name);
                }
            }
    
            /// <summary>
            /// 返回[[name]]
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            private static string MarkTypeDefault(string name)
            {
                return $"[[{name}]]";
            }
    
            /// <summary>
            /// 返回{{name}}
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            private static string MarkTypeCurlyBraces(string name)
            {
                return $"{{{{{name}}}}}";
            }
    
    
            /// <summary>
            /// 文本域处理泛型集合赋值
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="entity"></param>
            public void Execute<TEntity>(TEntity entity)
            {
                var type = entity.GetType();
                var properties = type.GetProperties();
                List<string> names = new List<string>();
                List<string> values = new List<string>();
                foreach (var item in properties)
                {
                    names.Add(item.Name);
                    var val = item.GetValue(entity, null);
                    if (val == null)
                        values.Add(null);
                    else
                        values.Add(item.GetValue(entity, null).ToString());
                }
                _doc.MailMerge.Execute(names.ToArray(), values.ToArray());
            }
    
            /// <summary>
            /// 文本域处理键值对赋值
            /// </summary>
            /// <param name="dic"></param>
            public void Execute(Dictionary<string, string> dic)
            {
                List<string> names = new List<string>();
                List<string> values = new List<string>();
                foreach (var item in dic)
                {
                    names.Add(item.Key);
                    values.Add(item.Value);
                }
                _doc.MailMerge.Execute(names.ToArray(), values.ToArray());
            }
    
    
    
            /// <summary>
            /// 文本域赋值用法
            /// </summary>
            /// <param name="fieldNames">key</param>
            /// <param name="fieldValues">value</param>
            public void ExecuteField(string[] fieldNames, object[] fieldValues)
            {
                _doc.MailMerge.Execute(fieldNames, fieldValues);
            }
            /// <summary>
            /// 文本域赋值用法
            /// </summary>
            /// <param name="fieldNames">key</param>
            /// <param name="fieldValues">value</param>
            public void ExecuteField(string fieldName, object fieldValue)
            {
                _doc.MailMerge.Execute(new string[] { fieldName }, new object[] { fieldValue });
            }
    
            /// <summary>
            /// 保存
            /// </summary>
            /// <param name="filePath"></param>
            public void Save(string filePath, SaveFormat saveFormat = SaveFormat.Doc)
            {
                _doc.Save(filePath, saveFormat);
            }
    
            /// <summary>
            /// 基于模版新建Word文件
            /// </summary>
            /// <param name="path">模板路径</param>
            public void OpenTempelte(string tempPath)
            {
                _doc = new Document(tempPath);
            }
    
            /// <summary>
            /// 书签赋值用法
            /// </summary>
            /// <param name="LabelId">书签名</param>
            /// <param name="Content">内容</param>
            public void WriteBookMark(string LabelId, string Content)
            {
                if (_doc.Range.Bookmarks[LabelId] != null)
                {
                    _doc.Range.Bookmarks[LabelId].Text = Content;
                }
            }
    
            /// <summary>
            /// 书签赋值用法
            /// </summary>
            /// <param name="entity">键值对</param>
            public void WriteBookMark(Dictionary<string, string> dic)
            {
                foreach (var item in dic)
                {
                    if (_doc.Range.Bookmarks[item.Key] != null)
                    {
                        _doc.Range.Bookmarks[item.Key].Text = item.Value;
                    }
                }
            }
    
            /// <summary>
            /// 列表赋值用法
            /// </summary>
            /// <param name="dt"></param>
            public void WriteTable(DataTable dt)
            {
                _doc.MailMerge.ExecuteWithRegions(dt);
            }
    
            /// <summary>
            /// 不可编辑受保护,需输入密码
            /// </summary>
            /// <param name="pwd">密码</param>
            public void NoEdit(string pwd)
            {
                _doc.Protect(ProtectionType.ReadOnly, pwd);
            }
    
            /// <summary>
            /// 只读
            /// </summary>
            public void ReadOnly()
            {
                _doc.Protect(ProtectionType.ReadOnly);
            }
    
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="filename">文件路径+文件名</param>
            /// <param name="field">文本域名</param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(string filename, string field, double width = 70, double height = 70)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(filename);
                shape.Width = width;//设置宽和高
                shape.Height = height;
                shape.WrapType = WrapType.Inline;
                shape.BehindText = true;
               
                builder.MoveToMergeField(field);
                builder.InsertNode(shape);
            }
    
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="filename">文件路径+文件名</param>
            /// <param name="field">文本域名</param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(string filename, string field, WrapType wrapType= WrapType.None, double width = 70, double height = 70)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(filename);
                shape.Width = width;//设置宽和高
                shape.Height = height;
                shape.WrapType = wrapType;
                shape.BehindText = true;
    
                builder.MoveToMergeField(field);
                builder.InsertNode(shape);
            }
    
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="filename">文件路径+文件名</param>
            /// <param name="field">文本域名</param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(string filename, string field)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(filename);
                shape.WrapType = WrapType.Inline;
                shape.BehindText = true;
                builder.MoveToMergeField(field);
                builder.InsertNode(shape);
            }
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="filename">文件路径+文件名</param>
            /// <param name="left"></param>
            /// <param name="top"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(string filename, double left = 0, double top = 0, double width = 70, double height = 70)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(filename);
                shape.Width = width;//设置宽和高
                shape.Height = height;
                shape.Top = top;
                shape.Left = left;
                builder.InsertNode(shape);
            }
    
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="field">文本域名</param>
            /// <param name="stream"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImageByStream(string field, Stream stream, double width = 70, double height = 70)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(stream);
                shape.Width = width;//设置宽和高
                shape.Height = height;
                shape.WrapType = WrapType.None;
                shape.BehindText = true;
                builder.MoveToMergeField(field);
                builder.InsertNode(shape);
            }
    
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="stream">文件</param>
            /// <param name="left"></param>
            /// <param name="top"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(string filename, double left = 0, double top = 0)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(filename);
                //shape.Width = width;//设置宽和高
                //shape.Height = height;
                shape.Top = top;
                shape.Left = left;
                builder.InsertNode(shape);
            }
            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="stream">文件</param>
            /// <param name="left"></param>
            /// <param name="top"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            public void AddImage(Stream stream, double left = 0, double top = 0)
            {
                DocumentBuilder builder = new DocumentBuilder(_doc);
                Shape shape = new Shape(_doc, ShapeType.Image);
                shape.ImageData.SetImage(stream);
                //shape.Width = width;//设置宽和高
                //shape.Height = height;
                shape.Top = top;
                shape.Left = left;
                builder.InsertNode(shape);
            }
    
            /// <summary>
            /// 通过流导出word文件
            /// </summary>
            /// <param name="fileName">文件名</param>
            public HttpResponseMessage ExportWord(string fileName, SaveFormat saveFormat = SaveFormat.Doc)
            {
                var stream = new MemoryStream();
                _doc.Save(stream, saveFormat);
                fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StreamContent(stream);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                string type = saveFormat == SaveFormat.Doc ? ".doc" : ".docx";
                result.Content.Headers.ContentDisposition.FileName = fileName + type;
                return result;
            }
    
            /// <summary>
            /// 通过流导出pdf文件
            /// </summary>
            /// <param name="fileName">文件名</param>
            public HttpResponseMessage ExportPdf(string fileName)
            {
                var stream = new MemoryStream();
                _doc.Save(stream, SaveFormat.Pdf);
                fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StreamContent(stream);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                result.Content.Headers.ContentDisposition.FileName = fileName + ".pdf";
                return result;
            }
    
            /// <summary>
            /// 基于模版新建Word文件
            /// </summary>
            /// <param name="stream">模板流</param>
            public void OpenTempelteStream(Stream stream)
            {
                _doc = new Document(stream);
            }
    
            /// <summary>
            /// 保存
            /// </summary>
            /// <param name="filePath"></param>
            public void SaveStream(Stream stream, SaveFormat saveFormat = SaveFormat.Doc)
            {
                _doc.Save(stream, saveFormat);
            }
    
            public SaveFormat GetSaveFormat(string ext)
            {
                if (string.IsNullOrWhiteSpace(ext))
                    return SaveFormat.Pdf;
                switch (ext.ToLower())
                {
                    case ".pdf": return SaveFormat.Pdf;
                    case ".docx": return SaveFormat.Docx;
                    case ".doc": return SaveFormat.Doc;
                    case ".dot": return SaveFormat.Dot;
                    case ".html": return SaveFormat.Html;
                    case ".png": return SaveFormat.Png;
                    case ".xps": return SaveFormat.Xps;
                    case ".tiff": return SaveFormat.Tiff;
                    case ".wordml": return SaveFormat.WordML;
                    case ".text": return SaveFormat.Text;
                    case ".jpeg": return SaveFormat.Jpeg;
                    case ".bmp": return SaveFormat.Bmp;
                    default: return SaveFormat.Pdf;
                }
            }
    
            /// <summary>
            /// 列表赋值用法(多集合)
            /// </summary>
            /// <param name="dt"></param>
            public void WriteDataSet(DataSet ds)
            {
                _doc.MailMerge.ExecuteWithRegions(ds);
            }
    
    
            public NodeCollection GetNodeCollection()
            {
                return _doc.GetChildNodes(NodeType.Table, true);
            }
    
            public Aspose.Words.DocumentBuilder GetDocumentBuilder()
            {
                return new Aspose.Words.DocumentBuilder(_doc);
            }
    
            public Aspose.Words.Tables.Cell CreateCell(string value)
            {
                Aspose.Words.Tables.Cell c1 = new Aspose.Words.Tables.Cell(_doc);
                Aspose.Words.Paragraph p = new Paragraph(_doc);
                p.AppendChild(new Run(_doc, value));
                c1.AppendChild(p);
            
                return c1;
            }
    
    
            public Aspose.Words.Tables.Row CreateRow(int columnCount, string[] columnValues)
            {
                Aspose.Words.Tables.Row r2 = new Aspose.Words.Tables.Row(_doc);
                for (int i = 0; i < columnCount; i++)
                {
                    if (columnValues.Length > i)
                    {
                        var cell = CreateCell(columnValues[i]);
                        r2.Cells.Add(cell);
                    }
                    else
                    {
                        var cell = CreateCell("");
                        r2.Cells.Add(cell);
                    }
    
                }
                return r2;
    
            }
    
    
            /// <summary>
            /// 行合并,根据同名合并,同名必须先排序排好
            /// </summary>
            /// <param name="table">要进行行合并的表</param>
            /// <param name="cols">行合并的列,0就第一行</param>
            public static void MergeRows(Table table, int[] cols)
            {
                string tempName = "";
                int tempIndex = 0;
                foreach (var col in cols)
                {
                    tempIndex = 0;
                    for (int i = 1; i < table.Rows.Count; i++)
                    {
                        tempName = table.Rows[i].Cells[col].GetText();
                        tempIndex = i;
    
                        for (int j = i + 1; j < table.Rows.Count; j++)
                        {
                            if (table.Rows[j].Cells[col].GetText() == tempName)
                                tempIndex = j;
                            else break;
                        }
    
                        if (tempIndex != i)
                        {
                            MergeCells(table.Rows[i].Cells[col], table.Rows[tempIndex].Cells[col]);
                            i = tempIndex + 1;
                            if (i >= table.Rows.Count)
                                break;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 合并表格
            /// </summary>
            /// <param name="startCell"></param>
            /// <param name="endCell"></param>
            public static void MergeCells(Cell startCell, Cell endCell)
            {
                Table parentTable = startCell.ParentRow.ParentTable;
    
                // Find the row and cell indices for the start and end cell.
                Point startCellPos = new Point(startCell.ParentRow.IndexOf(startCell), parentTable.IndexOf(startCell.ParentRow));
                Point endCellPos = new Point(endCell.ParentRow.IndexOf(endCell), parentTable.IndexOf(endCell.ParentRow));
                // Create the range of cells to be merged based off these indices. Inverse each index if the end cell if before the start cell.
                Rectangle mergeRange = new Rectangle(Math.Min(startCellPos.X, endCellPos.X), Math.Min(startCellPos.Y, endCellPos.Y), Math.Abs(endCellPos.X - startCellPos.X) + 1,
                Math.Abs(endCellPos.Y - startCellPos.Y) + 1);
    
                foreach (Row row in parentTable.Rows)
                {
                    foreach (Cell cell in row.Cells)
                    {
                        Point currentPos = new Point(row.IndexOf(cell), parentTable.IndexOf(row));
    
                        // Check if the current cell is inside our merge range then merge it.
                        if (mergeRange.Contains(currentPos))
                        {
                            if (currentPos.X == mergeRange.X)
                                cell.CellFormat.HorizontalMerge = CellMerge.First;
                            else
                                cell.CellFormat.HorizontalMerge = CellMerge.Previous;
    
                            if (currentPos.Y == mergeRange.Y)
                                cell.CellFormat.VerticalMerge = CellMerge.First;
                            else
                                cell.CellFormat.VerticalMerge = CellMerge.Previous;
                        }
                    }
                }
            }
    
        }
    View Code
  • 相关阅读:
    vue3 结合 echarts ,图表初始不渲染,当代码改变后才会渲染
    vue3结合three.js 展示3d模型时, 从a路由跳转到b路由,浏览器后退到a路由时,模型加载完后一片空白,并且自定义的CSS2DObject 标签 重复出现
    win7下安装nodejs16.4.0
    数据挖掘模型学习二分类
    真是人生无常,大肠包小肠
    sql优化
    第一个SpringMVC小案例
    (CVE202223131)ZABBIX绕过 SAML SSO 身份验证
    python openpyxl打开xlsx文件异常,UserWarning: File contains an invalid specification for Sheet1. This will be removed
    使用frp实现内网穿透
  • 原文地址:https://www.cnblogs.com/cvol/p/14622780.html
Copyright © 2020-2023  润新知