精华内容
下载资源
问答
  • word自动生成目录

    2018-05-07 16:27:43
    # word 2010 自动生成目录 #http://www.officezhushou.com/word2010/982.html

    # word 2010 自动生成目录 #

    https://jingyan.baidu.com/article/e3c78d640731a63c4c85f5e8.html

    http://www.officezhushou.com/word2010/982.html


    # word 2010取消自动编号 #

    http://www.wordlm.com/html/6087.html


    # word 指定页插入页码 # 

    https://jingyan.baidu.com/article/c85b7a642d30f7003bac9593.html


    # word怎样显示、删除分节符 #

    https://jingyan.baidu.com/article/e8cdb32b2577c837052bad3b.html


    # word怎样删除特定几页页码 #

    在需要删除页码的页面顶端,选择菜单 插入-分隔符-选择分节符(下一页)-这时切换到普通视图, 

    你会看到一个双线条的分节符,切换到页面视图,双击页码,编辑页码,在出现的页眉和页脚工具栏中把“链接到前一个”这个工具取消掉,

    使其页码能与前面的页码区分开,这时删掉页码即可

    展开全文
  • Word进行自动生成目录右边页面等格操作简单详细方法 Word文档自动生成的目录,但是由于目录的右边不等(见下图),看起来不美观,要将目录右边页面进行等格处理。 一、首先选择自动生成目录中我们自己看作标准内容...

    Word进行自动生成目录右边页面等格操作简单详细方法

    Word文档自动生成的目录,但是由于目录的右边不等(见下图),看起来不美观,所以我们可以将目录右边页面进行等格处理。

    在这里插入图片描述

    方法步骤如下:

    一、首先选择自动生成目录中我们自己看作标准内容(见下图红色箭头1指向的红色框内容,博主选择以第一章前言为标准),然后左击,再选择右击“段落(P)”(见下图红色箭头2指向的红色框内容)。

    在这里插入图片描述

    二、点击“制表位(T)”。

    在这里插入图片描述

    三(重点)、复制红色箭头1指向的红色框内容(博主举例的是制表符位置(T)是29.63字符),然后注意红色箭头2和红色箭头3指向的红色框内容,后续第六步要用到,记住之后点击“确定”。

    在这里插入图片描述

    四、选择自动生成目录中需要等格的内容(见下图红色箭头1指向的红色框内容,博主是全选了目录第一章中所有内容),然后左击,再选择右击“段落(P)”(见下图红色箭头2指向的红色框内容)。

    在这里插入图片描述

    五、点击“制表位(T)”。

    在这里插入图片描述

    六、将原本复制的内容粘贴到红色箭头1指向的红色框内容(29.63字符),然后注意根据之前第三步红色箭头2和红色箭头3指向的红色框内容,进行相同选择进行点击,最后点击“确定”。

    在这里插入图片描述

    七、从下图可以发现,目录中除了第一章那行,其余行右边页面都变成等格了。

    在这里插入图片描述

    八、如果需要全部等格可以将目录中第一章该行中的前面空格删掉就能够目录右边页面全部变成等格。

    在这里插入图片描述

    大家有什么疑问或者好的建议,欢迎在评论中提出!

    展开全文
  • 适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。代码:Github 一、主要需要完成功能: 1. 灵活的配置规则及word样式设置(文本、表格、图表、颜色等). 2. 支持表格. 3. ...

            将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能。适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。代码:Github

    一、主要需要完成功能:

    1. 灵活的配置规则及word样式设置(文本、表格、图表、颜色等).

    2. 支持表格.

    3. 支持图表.

    4. 支持章节内容循环生成.

    5. 支持目录.

    6.支持文档结构图

    7.更新指定位置的文字

    8.支持pdf导出.

     

    最后结果如下:

                                                                                图一

                                        图二

                                             图三

    二、需求分析与实现方式

       功能主要涉及3个比较重要的部分:数据源、Word样式、配置规则。 

         为了简单,数据源决定采用一个存储过程返回Dataset的方式, 整张报告的数据来源于此Dataset的多个Datatable.

      样式与配置:首先想到的是写一个config文件,所有配置都放到一个文件里,然后将数据按照这个规则生成word。但无疑这样的配置项太多了,关键是“样式”问题,比如字体、颜色、表格宽度.....想想就头大。而且没有“所见即所得”的效果,配置完都不知道啥样。

    后来决定采取修改的方式, 先以一个word文件作为模板,在模板中定义好上面提到的“样式”,然后在模板中做一个个标记,然后将数据按照规则更新到对应的标记。

                                                           图四

        而这个标记我们用到了word的一个叫【书签】的功能,打开word按ctrl+shift+F5, 打开书签功能,如下图:

                                     图五

    这样将【规则】通过一系列规则的【书签】定义到word模板中。

    三、规则配置

      思路确定了,那就开始设计如何通过【书签】将规则定义到word模板中去,这里决定将所有规则都通过【书签】实现,而放弃config文件的方式,这个更统一而且直观一些。

    A.循环

          以图四为例,数据库有多少张表是不固定的,我们在制作模板的时候不可能先画好N(N为表的总数)个表格等待数据填充, 这里就会需要遍历数据源中提供的所有表结构数据,然后逐一形成表格。这里就需要将图四中的表格循环一下,自动复制生成多个这样的表格。当然,这只是一种情况,还有可能会出现循环嵌套循环的情况,那么我将这个循环定义成一个书签的时候按照这样的格式:

          loop_级别_表序号_filter_名称

    含义如下:

         loop:代表这是一个循环。

         级别:默认文档级别为0,出现的第一层循环为1,其内部若再次嵌套循环则级别为2,依次类推。

         表序号:取Dataset中的第几张表(从1开始)

         filter:循环的时候可能会用到对datatable的查找过滤,在此写出,多个字段用XX隔开(因为此处不允许有下划线外其他特殊字符, 就用这个XX吧 )

         名称:loop名称,方便与其他 loop区别

     B.更新指定位置的文字

        如图四中的【服务器名】、【表总数】等,只需要替换对应的文字即可:

        label_级别_名称

    含义如下:

         label:代表这是一个label。

         级别:默认文档级别为0,出现的第一层循环为1,其内部若再次嵌套循环则级别为2,依次类推。

         名称:label名称

         注意这里省略了表序号,当级别为0的时候 ,自动取最后一个datatable中的数据,因为这个label经常会用到其他表汇总的数据,可能会用到之前几张表的数据,所以放在其他表都处理好后。当级别为1的时候,自然取该级别循环的行数据。

    C.表格

         表格的配置原本也想对表格添加书签,后来发现有个表格属性, 觉得写在这里更好一些。

     如上图所示,【标题】格式为:table_级别_取Dataset中的第几张表(从1开始)_filter字段多个用XX隔开(此处不允许有下划线外其他特殊字符, 就用这个XX吧 )_名称

    【说明】为可选项,若需要合计行, 则需要标识, summary或缩写s: [合计]行是模板中表格的第几行   summaryfilter或缩写sf:数据集进一步filter到summary行的条件(因为一个表格只取一个Datatable,通过一个标识指定了哪些datarow是用来作为合计的)

    D.图表

    同样为了方便将配置写在了【标题】,图表生成后会将名称修改过来。

    配置格式为:chart_级别_取Dataset中的第几张表(从1开始)_filter字段多个用XX隔开(此处不允许有下划线外其他特殊字符, 就用这个XX吧 )_chart名称_是否将Datatable的columnName作为第一行_从datatable第几列开始(列起始为1)_截止列,

    如下图所示配置即可。

     

    E.目录

    无需标识, 模板中添加目录, 当内容处理完成之后, 会根据处理后的结果动态更新目录.

     

    四、主要代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Data;
      4 using System.Diagnostics;
      5 using System.IO;
      6 using System.Linq;
      7 using System.Reflection;
      8 using Excel = Microsoft.Office.Interop.Excel;
      9 using Word = Microsoft.Office.Interop.Word;
     10 
     11 namespace FlyLolo.WordReport.Demo
     12 {
     13     public class WordReportHelper
     14     {
     15         private Word.Application wordApp = null;
     16         private Word.Document wordDoc = null;
     17         private DataSet dataSource = null;
     18         private object line = Word.WdUnits.wdLine;
     19         private string errorMsg = "";
     20 
     21         /// <summary>
     22         /// 根据模板文件,创建数据报告
     23         /// </summary>
     24         /// <param name="templateFile">模板文件名(含路径)</param>
     25         /// <param name="newFilePath">新文件路径)</param>
     26         /// <param name="dataSource">数据源,包含多个datatable</param>
     27         /// <param name="saveFormat">新文件格式:</param>
     28         public bool CreateReport(string templateFile, DataSet dataSource, out string errorMsg, string newFilePath, ref string newFileName, int saveFormat = 16)
     29         {
     30             this.dataSource = dataSource;
     31             errorMsg = this.errorMsg;
     32             bool rtn = OpenTemplate(templateFile)
     33                 && SetContent(new WordElement(wordDoc.Range(), dataRow: dataSource.Tables[dataSource.Tables.Count - 1].Rows[0]))
     34                 && UpdateTablesOfContents()
     35                 && SaveFile(newFilePath, ref newFileName, saveFormat);
     36 
     37             CloseAndClear();
     38             return rtn;
     39         }
     40 
     41         /// <summary>
     42         /// 打开模板文件
     43         /// </summary>
     44         /// <param name="templateFile"></param>
     45         /// <returns></returns>
     46         private bool OpenTemplate(string templateFile)
     47         {
     48             if (!File.Exists(templateFile))
     49             {
     50                 return false;
     51             }
     52 
     53             wordApp = new Word.Application();
     54             wordApp.Visible = true;//使文档可见,调试用
     55             wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
     56             object file = templateFile;
     57             wordDoc = wordApp.Documents.Open(ref file, ReadOnly: false);
     58             return true;
     59         }
     60 
     61         /// <summary>
     62         /// 为指定区域写入数据
     63         /// </summary>
     64         /// <param name="element"></param>
     65         /// <returns></returns>
     66         private bool SetContent(WordElement element)
     67         {
     68             string currBookMarkName = string.Empty;
     69             string startWith = "loop_" + (element.Level + 1).ToString() + "_";
     70             foreach (Word.Bookmark item in element.Range.Bookmarks)
     71             {
     72                 currBookMarkName = item.Name;
     73 
     74                 if (currBookMarkName.StartsWith(startWith) && (!currBookMarkName.Equals(element.ElementName)))
     75                 {
     76                     SetLoop(new WordElement(item.Range, currBookMarkName, element.DataRow, element.GroupBy));
     77                 }
     78 
     79             }
     80 
     81             SetLabel(element);
     82 
     83             SetTable(element);
     84 
     85             SetChart(element);
     86 
     87             return true;
     88         }
     89 
     90         /// <summary>
     91         /// 处理循环
     92         /// </summary>
     93         /// <param name="element"></param>
     94         /// <returns></returns>
     95         private bool SetLoop(WordElement element)
     96         {
     97             DataRow[] dataRows = dataSource.Tables[element.TableIndex].Select(element.GroupByString);
     98             int count = dataRows.Count();
     99             element.Range.Select();
    100 
    101             //第0行作为模板  先从1开始  循环后处理0行;
    102             for (int i = 0; i < count; i++)
    103             {
    104 
    105                 element.Range.Copy();  //模板loop复制
    106                 wordApp.Selection.InsertParagraphAfter();//换行 不会清除选中的内容,TypeParagraph 等同于回车,若当前有选中内容会被清除. TypeParagraph 会跳到下一行,InsertParagraphAfter不会, 所以movedown一下.
    107                 wordApp.Selection.MoveDown(ref line, Missing.Value, Missing.Value);
    108                 wordApp.Selection.Paste(); //换行后粘贴复制内容
    109                 int offset = wordApp.Selection.Range.End - element.Range.End; //计算偏移量
    110 
    111                 //复制书签,书签名 = 模板书签名 + 复制次数
    112                 foreach (Word.Bookmark subBook in element.Range.Bookmarks)
    113                 {
    114                     if (subBook.Name.Equals(element.ElementName))
    115                     {
    116                         continue;
    117                     }
    118 
    119                     wordApp.Selection.Bookmarks.Add(subBook.Name + "_" + i.ToString(), wordDoc.Range(subBook.Start + offset, subBook.End + offset));
    120                 }
    121 
    122                 SetContent(new WordElement(wordDoc.Range(wordApp.Selection.Range.End - (element.Range.End - element.Range.Start), wordApp.Selection.Range.End), element.ElementName + "_" + i.ToString(), dataRows[i], element.GroupBy));
    123             }
    124 
    125             element.Range.Delete();
    126 
    127             return true;
    128         }
    129 
    130         /// <summary>
    131         /// 处理简单Label
    132         /// </summary>
    133         /// <param name="element"></param>
    134         /// <returns></returns>
    135         private bool SetLabel(WordElement element)
    136         {
    137             if (element.Range.Bookmarks != null && element.Range.Bookmarks.Count > 0)
    138             {
    139                 string startWith = "label_" + element.Level.ToString() + "_";
    140                 string bookMarkName = string.Empty;
    141                 foreach (Word.Bookmark item in element.Range.Bookmarks)
    142                 {
    143                     bookMarkName = item.Name;
    144 
    145                     if (bookMarkName.StartsWith(startWith))
    146                     {
    147                         bookMarkName = WordElement.GetName(bookMarkName);
    148 
    149                         item.Range.Text = element.DataRow[bookMarkName].ToString();
    150                     }
    151                 }
    152             }
    153 
    154             return true;
    155         }
    156 
    157         /// <summary>
    158         /// 填充Table
    159         /// </summary>
    160         /// <param name="element"></param>
    161         /// <returns></returns>
    162         private bool SetTable(WordElement element)
    163         {
    164             if (element.Range.Tables != null && element.Range.Tables.Count > 0)
    165             {
    166                 string startWith = "table_" + element.Level.ToString() + "_";
    167                 foreach (Word.Table table in element.Range.Tables)
    168                 {
    169                     if (!string.IsNullOrEmpty(table.Title) && table.Title.StartsWith(startWith))
    170                     {
    171                         WordElement tableElement = new WordElement(null, table.Title, element.DataRow);
    172 
    173                         TableConfig config = new TableConfig(table.Descr);
    174 
    175                         object dataRowTemplate = table.Rows[config.DataRow];
    176                         Word.Row SummaryRow = null;
    177                         DataRow SummaryDataRow = null;
    178                         DataTable dt = dataSource.Tables[tableElement.TableIndex];
    179                         DataRow[] dataRows = dataSource.Tables[tableElement.TableIndex].Select(tableElement.GroupByString); ;
    180 
    181                         if (config.SummaryRow > 0)
    182                         {
    183                             SummaryRow = table.Rows[config.SummaryRow];
    184                             SummaryDataRow = dt.Select(string.IsNullOrEmpty(tableElement.GroupByString) ? config.SummaryFilter : tableElement.GroupByString + " and  " + config.SummaryFilter).FirstOrDefault();
    185                         }
    186 
    187                         foreach (DataRow row in dataRows)
    188                         {
    189                             if (row == SummaryDataRow)
    190                             {
    191                                 continue;
    192                             }
    193 
    194                             Word.Row newRow = table.Rows.Add(ref dataRowTemplate);
    195                             for (int j = 0; j < table.Columns.Count; j++)
    196                             {
    197                                 newRow.Cells[j + 1].Range.Text = row[j].ToString(); ;
    198                             }
    199 
    200                         }
    201 
    202                         ((Word.Row)dataRowTemplate).Delete();
    203 
    204                         if (config.SummaryRow > 0 && SummaryDataRow != null)
    205                         {
    206                             for (int j = 0; j < SummaryRow.Cells.Count; j++)
    207                             {
    208                                 string temp = SummaryRow.Cells[j + 1].Range.Text.Trim().Replace("\r\a", "");
    209 
    210                                 if (!string.IsNullOrEmpty(temp) && temp.Length > 2 && dt.Columns.Contains(temp.Substring(1, temp.Length - 2)))
    211                                 {
    212                                     SummaryRow.Cells[j + 1].Range.Text = SummaryDataRow[temp.Substring(1, temp.Length - 2)].ToString();
    213                                 }
    214                             }
    215                         }
    216 
    217                         table.Title = tableElement.Name;
    218                     }
    219 
    220 
    221                 }
    222             }
    223 
    224             return true;
    225         }
    226 
    227         /// <summary>
    228         /// 处理图表
    229         /// </summary>
    230         /// <param name="element"></param>
    231         /// <returns></returns>
    232         private bool SetChart(WordElement element)
    233         {
    234             if (element.Range.InlineShapes != null && element.Range.InlineShapes.Count > 0)
    235             {
    236                 List<Word.InlineShape> chartList = element.Range.InlineShapes.Cast<Word.InlineShape>().Where(m => m.Type == Word.WdInlineShapeType.wdInlineShapeChart).ToList();
    237                 string startWith = "chart_" + element.Level.ToString() + "_";
    238                 foreach (Word.InlineShape item in chartList)
    239                 {
    240                     Word.Chart chart = item.Chart;
    241                     if (!string.IsNullOrEmpty(chart.ChartTitle.Text) && chart.ChartTitle.Text.StartsWith(startWith))
    242                     {
    243                         WordElement chartElement = new WordElement(null, chart.ChartTitle.Text, element.DataRow);
    244 
    245                         DataTable dataTable = dataSource.Tables[chartElement.TableIndex];
    246                         DataRow[] dataRows = dataTable.Select(chartElement.GroupByString);
    247 
    248                         int columnCount = dataTable.Columns.Count;
    249                         List<int> columns = new List<int>();
    250 
    251                         foreach (var dr in dataRows)
    252                         {
    253                             for (int i = chartElement.ColumnStart == -1 ? 0 : chartElement.ColumnStart - 1; i < (chartElement.ColumnEnd == -1 ? columnCount : chartElement.ColumnEnd); i++)
    254                             {
    255                                 if (columns.Contains(i) || dr[i] == null || string.IsNullOrEmpty(dr[i].ToString()))
    256                                 {
    257 
    258                                 }
    259                                 else
    260                                 {
    261                                     columns.Add(i);
    262                                 }
    263                             }
    264                         }
    265                         columns.Sort();
    266                         columnCount = columns.Count;
    267                         int rowsCount = dataRows.Length;
    268 
    269                         Word.ChartData chartData = chart.ChartData;
    270 
    271                         //chartData.Activate();
    272                         //此处有个比较疑惑的问题, 不执行此条,生成的报告中的图表无法再次右键编辑数据. 执行后可以, 但有两个问题就是第一会弹出Excel框, 处理完后会自动关闭. 第二部分chart的数据range设置总不对
    273                         //不知道是不是版本的问题, 谁解决了分享一下,谢谢
    274 
    275                         Excel.Workbook dataWorkbook = (Excel.Workbook)chartData.Workbook;
    276                         dataWorkbook.Application.Visible = false;
    277 
    278                         Excel.Worksheet dataSheet = (Excel.Worksheet)dataWorkbook.Worksheets[1];
    279                         //设定范围  
    280                         string a = (chartElement.ColumnNameForHead ? rowsCount + 1 : rowsCount) + "|" + columnCount;
    281                         Console.WriteLine(a);
    282 
    283                         Excel.Range tRange = dataSheet.Range["A1", dataSheet.Cells[(chartElement.ColumnNameForHead ? rowsCount + 1 : rowsCount), columnCount]];
    284                         Excel.ListObject tbl1 = dataSheet.ListObjects[1];
    285                         //dataSheet.ListObjects[1].Delete(); //想过重新删除再添加  这样 原有数据清掉了, 但觉得性能应该会有所下降
    286                         //Excel.ListObject tbl1 = dataSheet.ListObjects.AddEx();
    287                         tbl1.Resize(tRange);
    288                         for (int j = 0; j < rowsCount; j++)
    289                         {
    290                             DataRow row = dataRows[j];
    291                             for (int k = 0; k < columnCount; k++)
    292                             {
    293                                 dataSheet.Cells[j + 2, k + 1].FormulaR1C1 = row[columns[k]];
    294                             }
    295                         }
    296 
    297                         if (chartElement.ColumnNameForHead)
    298                         {
    299                             for (int k = 0; k < columns.Count; k++)
    300                             {
    301                                 dataSheet.Cells[1, k + 1].FormulaR1C1 = dataTable.Columns[columns[k]].ColumnName;
    302                             }
    303                         }
    304                         chart.ChartTitle.Text = chartElement.Name;
    305                         //dataSheet.Application.Quit();
    306                     }
    307                 }
    308             }
    309 
    310             return true;
    311         }
    312 
    313         /// <summary>
    314         /// 更新目录
    315         /// </summary>
    316         /// <returns></returns>
    317         private bool UpdateTablesOfContents()
    318         {
    319             foreach (Word.TableOfContents item in wordDoc.TablesOfContents)
    320             {
    321                 item.Update();
    322             }
    323 
    324             return true;
    325         }
    326 
    327         /// <summary>
    328         /// 保存文件
    329         /// </summary>
    330         /// <param name="newFilePath"></param>
    331         /// <param name="newFileName"></param>
    332         /// <param name="saveFormat"></param>
    333         /// <returns></returns>
    334         private bool SaveFile(string newFilePath, ref string newFileName, int saveFormat = 16)
    335         {
    336             if (string.IsNullOrEmpty(newFileName))
    337             {
    338                 newFileName = DateTime.Now.ToString("yyyyMMddHHmmss");
    339 
    340                 switch (saveFormat)
    341                 {
    342                     case 0:// Word.WdSaveFormat.wdFormatDocument
    343                         newFileName += ".doc";
    344                         break;
    345                     case 16:// Word.WdSaveFormat.wdFormatDocumentDefault
    346                         newFileName += ".docx";
    347                         break;
    348                     case 17:// Word.WdSaveFormat.wdFormatPDF
    349                         newFileName += ".pdf";
    350                         break;
    351                     default:
    352                         break;
    353                 }
    354             }
    355 
    356             object newfile = Path.Combine(newFilePath, newFileName);
    357             object wdSaveFormat = saveFormat;
    358             wordDoc.SaveAs(ref newfile, ref wdSaveFormat);
    359             return true;
    360         }
    361 
    362         /// <summary>
    363         /// 清理
    364         /// </summary>
    365         private void CloseAndClear()
    366         {
    367             if (wordApp == null)
    368             {
    369                 return;
    370             }
    371             wordDoc.Close(Word.WdSaveOptions.wdDoNotSaveChanges);
    372             wordApp.Quit(Word.WdSaveOptions.wdDoNotSaveChanges);
    373             System.Runtime.InteropServices.Marshal.ReleaseComObject(wordDoc);
    374             System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
    375             wordDoc = null;
    376             wordApp = null;
    377             GC.Collect();
    378             KillProcess("Excel", "WINWORD");
    379         }
    380 
    381         /// <summary>
    382         /// 杀进程..
    383         /// </summary>
    384         /// <param name="processNames"></param>
    385         private void KillProcess(params string[] processNames)
    386         {
    387             //Process myproc = new Process();
    388             //得到所有打开的进程  
    389             try
    390             {
    391                 foreach (string name in processNames)
    392                 {
    393                     foreach (Process thisproc in Process.GetProcessesByName(name))
    394                     {
    395                         if (!thisproc.CloseMainWindow())
    396                         {
    397                             if (thisproc != null)
    398                                 thisproc.Kill();
    399                         }
    400                     }
    401                 }
    402             }
    403             catch (Exception)
    404             {
    405                 //throw Exc;
    406                 // msg.Text+=  "杀死"  +  processName  +  "失败!";  
    407             }
    408         }
    409     }
    410 
    411     /// <summary>
    412     /// 封装的Word元素
    413     /// </summary>
    414     public class WordElement
    415     {
    416         public WordElement(Word.Range range, string elementName = "", DataRow dataRow = null, Dictionary<string, string> groupBy = null, int tableIndex = 0)
    417         {
    418             this.Range = range;
    419             this.ElementName = elementName;
    420             this.GroupBy = groupBy;
    421             this.DataRow = dataRow;
    422             if (string.IsNullOrEmpty(elementName))
    423             {
    424                 this.Level = 0;
    425                 this.TableIndex = tableIndex;
    426                 this.Name = string.Empty;
    427                 this.ColumnNameForHead = false;
    428             }
    429             else
    430             {
    431                 string[] element = elementName.Split('_');
    432                 this.Level = int.Parse(element[1]);
    433                 this.ColumnNameForHead = false;
    434                 this.ColumnStart = -1;
    435                 this.ColumnEnd = -1;
    436 
    437                 if (element[0].Equals("label"))
    438                 {
    439                     this.Name = element[2];
    440                     this.TableIndex = 0;
    441                 }
    442                 else
    443                 {
    444                     this.Name = element[4];
    445                     this.TableIndex = int.Parse(element[2]) - 1;
    446 
    447                     if (!string.IsNullOrEmpty(element[3]))
    448                     {
    449                         string[] filters = element[3].Split(new string[] { "XX" }, StringSplitOptions.RemoveEmptyEntries);
    450                         if (this.GroupBy == null)
    451                         {
    452                             this.GroupBy = new Dictionary<string, string>();
    453                         }
    454                         foreach (string item in filters)
    455                         {
    456                             if (!this.GroupBy.Keys.Contains(item))
    457                             {
    458                                 this.GroupBy.Add(item, dataRow[item].ToString());
    459                             }
    460 
    461                         }
    462                     }
    463 
    464                     if (element[0].Equals("chart") && element.Count() > 5)
    465                     {
    466                         this.ColumnNameForHead = element[5].Equals("1");
    467                         this.ColumnStart = string.IsNullOrEmpty(element[6]) ? -1 : int.Parse(element[6]);
    468                         this.ColumnEnd = string.IsNullOrEmpty(element[7]) ? -1 : int.Parse(element[7]);
    469                     }
    470                 }
    471             }
    472         }
    473 
    474         public Word.Range Range { get; set; }
    475         public int Level { get; set; }
    476         public int TableIndex { get; set; }
    477         public string ElementName { get; set; }
    478 
    479         public DataRow DataRow { get; set; }
    480         public Dictionary<string, string> GroupBy { get; set; }
    481 
    482         public string Name { get; set; }
    483 
    484         public bool ColumnNameForHead { get; set; }
    485         public int ColumnStart { get; set; }
    486         public int ColumnEnd { get; set; }
    487 
    488         public string GroupByString
    489         {
    490             get
    491             {
    492                 if (GroupBy == null || GroupBy.Count == 0)
    493                 {
    494                     return string.Empty;
    495                 }
    496 
    497                 string rtn = string.Empty;
    498                 foreach (string key in this.GroupBy.Keys)
    499                 {
    500                     rtn += "and " + key + " = '" + GroupBy[key] + "' ";
    501                 }
    502                 return rtn.Substring(3);
    503             }
    504         }
    505 
    506         public static string GetName(string elementName)
    507         {
    508             string[] element = elementName.Split('_');
    509 
    510 
    511             if (element[0].Equals("label"))
    512             {
    513                 return element[2];
    514             }
    515             else
    516             {
    517                 return element[4];
    518             }
    519         }
    520     }
    521 
    522     /// <summary>
    523     /// Table配置项
    524     /// </summary>
    525     public class TableConfig
    526     {
    527         public TableConfig(string tableDescr = "")
    528         {
    529             this.DataRow = 2;
    530             this.SummaryRow = -1;
    531 
    532             if (!string.IsNullOrEmpty(tableDescr))
    533             {
    534                 string[] element = tableDescr.Split(',');
    535                 foreach (string item in element)
    536                 {
    537                     if (!string.IsNullOrEmpty(item))
    538                     {
    539                         string[] configs = item.Split(':');
    540                         if (configs.Length == 2)
    541                         {
    542                             switch (configs[0].ToLower())
    543                             {
    544                                 case "data":
    545                                 case "d":
    546                                     this.DataRow = int.Parse(configs[1]);
    547                                     break;
    548                                 case "summary":
    549                                 case "s":
    550                                     this.SummaryRow = int.Parse(configs[1]);
    551                                     break;
    552                                 case "summaryfilter":
    553                                 case "sf":
    554                                     this.SummaryFilter = configs[1];
    555                                     break;
    556                                 default:
    557                                     break;
    558                             }
    559                         }
    560                     }
    561                 }
    562             }
    563 
    564         }
    565         public int DataRow { get; set; }
    566         public int SummaryRow { get; set; }
    567         public string SummaryFilter { get; set; }
    568     }
    569 }
    View Code

     

    展开全文
  • word中的自动生成目录当中,我们会看到是这样的目录结构: 嗯,自动生成固然是简单,但是在html当中,却没有一个合适的标签来去做。今天后台导出PDF的时候告诉我,他需要用html做一个这样的结构,然后想了想,...

    在word中的自动生成目录当中,我们会看到是这样的目录结构:

    1083235-20170816152650396-1062585427.png

    嗯,自动生成固然是简单,但是在html当中,却没有一个合适的标签来去做。今天后台导出PDF的时候告诉我,他需要用html做一个这样的结构,然后想了想,实现了第一种方法:

    一.js&css结合法

    话不多说,直接上代码,代码解决

    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            * {
                marker: 0;
                padding: 0;
            }
    
            p {
                width: 300px;
              height: 20px;
                position: relative;
            }
    
    
            s {
                display: inline-block;
                height: 100%;
                border-bottom: 1px dotted black;
            }
        </style>
    </head>
    <body>
    <p>
        <span>第一层目录</span><s></s>
    </p>
    </body>
    <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <script>
        $(function () {
            var resultWidth = $("p").width() - $("span").width();
            $("s").css("width",resultWidth)
        })
    </script>
    

      那个后面的点点点啊,我在想实现方法的时候突然想到了下划线的原点虚线,即border-bottom:1px dotted blank


    还有最重要的一点就是后面的点点点是根绝前面内容自动填充的啊,那我就写一个js来获得span的宽度,用父盒子的宽度减去span的宽度就是点点点的宽度啊,嗯,我真聪明;
    然而,后台大哥告诉我不能用js,好的,那就用css,多大点事



    二.纯css生成
    照例上代码
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            * {
                marker: 0;
                padding: 0;
            }
    
            p {
                width: 300px;
              height: 20px;
                position: relative;
            }
    
            span {
                position: absolute;
                left: 0;
                z-index: 2;
                background-color: white;
    
            }
    
            s {
                display: inline-block;
                height: 100%;
                width: 100%;
                position: absolute;
                left: 0;
                bottom: 0;
                /*z-index: -1;*/
                border-bottom: 1px dotted black;
            }
        </style>
    </head>
    <body>
    <p>
        <span>第一层目录</span><s></s>
    </p>
    </body>

    还是原来的配方,还是原来的味道,少了jq的催化,增加了css的味道。
    在这里我想起了定位以及z-index层级关系,最重要的一点是要进行遮盖,一定要记得设置span的背景色,否则层级关系的覆盖效果不明显
    好嘞,看看最后的结果吧

    1083235-20170816153819600-47871893.png

     

    完美................................







    展开全文
  • 怎样在word转PDF的时候自动生成目录

    千次阅读 2019-05-01 17:12:05
    首先,确保你的word文档中已经包含自动生成目录; 选择左上角的“文件”; 另存为,设置好文件名,文件类型选择PDF; 选择“选项”按钮,在弹出的窗口中,勾选“创建书签时使用标题”; 确定...
  • 工程地址:https://github.com/zheng-chang-wei/word package com.example.demo1.poi; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.File; import java.io.FileOutputStream; public ...
  • word2007自动生成目录,目录里包含有正文,怎么办相关说明:请看,显示级别那项,1级,2级,3级文本显示的都没有正文的,可是目录生成出来就是有大刚视图中确认大刚级别为“正文文本”,不要用手动换行符)。...
  • word 目录自动生成,和页眉页脚的设置
  • //生成目录结构时 需要这个功能 已达到生成下标的作用 public static void createDefaultFooter(final XWPFDocument docx) { // TODO 设置页码起始值 CTP pageNo = CTP.Factory.newInstance(); XWPFParagraph ...
  • 生成目录 //将光标移到文档开始的位置 builder.moveToDocumentStart(); builder.insertBreak(BreakType.PAGE_BREAK); //设置目录的格式 //“目录”两个字居中显示、加粗、搜宋体 builder.getCurrentParagraph()....
  • word生成目录的pdf

    2019-09-27 13:21:29
    注意:待转换Word中应该有目录,可以用Word中的标题来自动生成目录。 我用的office2016,但功能都差不多 1、文件另存时,选择另存为PDF或者XPS 2、在扩展设置中,选择红框中的“选项” 3、打开“选项”设置...
  • 生成目录超头疼,手动生成目录要调的时候太痛苦了,还是自动生成的好 1.新建一个word文档,新建样式 在文档中打字,一级,二级,三级,四级,调节成适合的字体和字号,这里字体都是黑体,一级是三号,其他是四号,...
  • Word转PDF时自动生成书签(目录

    千次阅读 2011-12-21 15:07:24
    Word目录方便查看,后来慢慢发现PDF格式的文档阅读起来很舒服,就想着将写好了的Word文档转换成PDF格式。  我的office是2007版本的, 最先的操作是,下载了一个虚拟打印机软件安装了,然后打开word,单击offic...
  • jacob生成word目录

    2017-08-17 15:29:33
    任务目的 1自动生成word文档目录。 用例测试操作步骤 在一个word文档的第二页填写占位符: {目录}保存。调用程序读取目标文档,自动根据标题生成目录到{目录}位置。
  • myeclipse中直接把jsp中table内容导出word,一看就懂。
  • word点击引用点击目录下拉箭头,选择自动目录的那个目录样式。 生成目录之后,点击特色应用。点击输出为pdf。 生成之后再点击目录就可以自动跳转了。
  • 利用poi读取word模板文件,并回填逻辑数据,生成导出需要的word文档源码。解决模板读取异常问题,提供wordUtils工具类(各种功能实现)
  • 文章目录开发准备模板准备开发测试结果检测功能通用化思考Dom4j实现智能化复选框部分源码集合部分源码图片部分源码基于word自动导出(含源码)参考网络文章# 加入战队微信公众号 开发准备 本文实现基于springboot,...
  • POI XWPFDocument 导出word目录详解

    千次阅读 2019-09-26 14:24:18
    通过XWPFDocument生成目录 ...按照顺序,只能在word中写入所有内容后在掉createTOC()生成目录,导致目录在最下方 下面我们重写createTOC()来完成对目录样式,布局,标题,位置的修改 /** * 生成目...
  • word文档怎样设置自动生成多级标题一篇文章,怎么也会有标题存在,有标题才能创建目录,那么word怎么设置标题呢?下面小编整理了word文档设置自动生成...二、自动生成目录1.把光标定位到文章第1页的首行第1个字符左侧...
  • 为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便。 <!-- https://mvnrepository.com/artifact/freemarker/freemarker --> <dependency> <groupId>...
  • java XML解析方式实现自动生成word文档,文档中主要描述word模板的使用方法,文件中带有案例代码,可以方便理解
  • WPS中如何自动生成文件目录

    千次阅读 2016-02-14 16:51:57
    这篇博文主要是讲解在WPS中如何自动生成文件的目录,这个功能还是比较常用的,介于本人之前因为这个问题和某某同学起过冲突,这里记录一下学习的过程。目录的生成这里以一个文章为例,使用的是最新版的WPS,文章内容...
  •  3,根据处理完毕的word动态生成目录(前面的数字需要手写,用系统自带的序号,会导致生成的目录前面带数字)  4,插入斜体文字水印  5,用aspose.words处理spire.doc在文档第一页留下的一段文字  5.1,Evaluation...
  • Java POI生成导出word(简单)

    千次阅读 2019-05-16 14:06:38
    该功能只是针对简单的需求导出一个空白或简单数据的word文件 /** * @Title: PoiToWord.java * @Package com.rionsoft.utils.tools * @Description: TODO(用一句话描述该文件做什么) */ package *; import ...
  • 使用FreePic2Pdf导出书签至Word建立层级目录 ——快速初始化Word笔记本目录 文:安徽师范大学2014级计算机科学与技术 王昊 (Get Contact:441301158@qq.com) 很多人都有使用计算机阅读PDF文档并在X86平台上使用...
  • freemark生成word,前端导出压缩包zip,前端代码: $("#exprotStaffZip").click(exprotStaffZipFun); function exprotStaffZipFun(){ var data=table.checkStatus("archivesTable").data; if(data.length<=0){...
  • Mac中的Word 2016文档在另存为PDF中没有“选项”这个功能可以使用,因此默认导出的PDF文件没有Word中的目录作为的书签。下面为可以携带书签的PDF导出过程。 Mac中Word 2016导出PDF附带书签目录结构具体过程 1. 在...
  • 目录目标一、pom.xml准备二、工具类配置及生成三、导出示例截图(html)四、说明 目标 将数据库表字段分表生成表单,自动对应表字段以及注释,可导出为 html | doc | md 文件。 一、pom.xml准备 <!-- screw核心...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,934
精华内容 5,573
关键字:

word自动生成目录导出