说明(2017-12-22 11:20:44):

1. 因为数学脚本的主标题和副标题没有格式,目录导航里不显示,修改的时候不好定位,所以需要改成下图格式:

2. 问题的难点有两个,一个是word的操作,c#操作word本来应该是顺理成章、水到渠成的,不过实际上并没有很好的参考资料,最权威的MSDN虽然很详细,但是内容太多、查找起来太费劲https://msdn.microsoft.com/vba/vba-word。我查到的一个比较精简的word操作,https://www.cnblogs.com/shi2172843/p/5848116.html,应付一般的问题足够了。但是还有很多不常用的设置,比如我这个设置标题,网上根本就查不到了,研究了半天,得出一个终极结论:使用VBA录制宏,然后去VS里通过智能提示,找到C#里对应的方法,基本跟VBA里的名字是一样的,比如:

VBA里的设置标题,和左对齐:

C#里的设置标题,和左对齐:

3. 问题的第二个难点是,C#对文件的操作,因为设计目标是把文件夹里所有的word文件都获取到,但是Directory.GetDirectories和Directory.GetFiles只能获取一层文件夹里的子文件夹和文件,如果里面还有子文件夹的话就拿不到了。这个问题拖了好几天,昨天晚上灵光一现给解决了。似乎是用了递归,因为一直觉得递归挺难的,之前查的资料也是用的递归,但是我看不太懂,http://blog.csdn.net/kwy15732621629/article/details/72085701,我对那种参数很多、封装很好的方法有点抵触,就决定自己试着写了一个,我记得之前好像是蒋坤说的,递归有两个特点,一个是调用自身,一个是要有返回值,特别注意不要出现无限递归。我觉得自己写的这个方法这两点都做到了,反正写完测试了一下,可以正常获取所有子目录文件。代码如下,应该是很通俗易懂了:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; namespace _00_Test
{ class Program
{
static void Main(string[] args)
{
string path = @"C:\Users\JJW\Desktop\新建文件夹";
List<string> list = GetFile(path);
foreach (string l in list)
{
Console.WriteLine(l);
}
Console.ReadKey();
}
private static List<string> GetFile(string path)
{
//传入一个路径
List<string> list = new List<string>();
//如果路径是文件夹,继续遍历,把新遍历出来的文件夹和文件存到list
if (Directory.Exists(path))
{
string[] dirs = Directory.GetDirectories(path);
if (dirs != null)
{
foreach (string dir in dirs)
{
list.AddRange(GetFile(dir));
}
} string[] files = Directory.GetFiles(path);
if (files != null)
{
list.AddRange(files);
}
}
//如果路径是文件,添加到list
else if (File.Exists(path))
{
list.Add(path);
}
return list;
}
}
}

4. 剩下的是完整代码,为了自己以后方便抄的,不放winform的了,反正就拖一下完事:

Form1.cs

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using msWord = Microsoft.Office.Interop.Word; namespace CheckLabel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnOK_Click(object sender, EventArgs e)
{
//实例化wordapp类
msWord.Application app = new msWord.Application();
//操作时显示word,测试时使用,实际使用时隐藏就可以了
app.Visible = false;
//判断拖入的文件夹是否存在
if (Directory.Exists(txtBox.Text))
{
//获取路径下所有doc和docx文件,如果拖入的是文件夹,就需要继续遍历文件夹,这里有两种方式,一种是递归遍历,另一种根据文件夹结构读取每个文件夹,反正每个版本就一层文件夹。
//string[] paths = Directory.GetFiles(Path.GetDirectoryName(txtBox.Text), "*.doc*");
List<string> files = GetFile(txtBox.Text);
//两个泛型,A是标题1,B是副标题
List<string> labelA = new List<string> { "课前预习导学", "课后复习巩固", "自我测试及解答", "能力提升" };
List<string> labelB = new List<string> { "定义及说明", "简单例题", "(三)练习", "课堂回顾", "经典例题及解答点拨", "写作业", "中考知识点", "中考真题及解答", "拓展提高及解答" }; //遍历所有路径
foreach (string file in files)
{
//判断doc文件是否存在
if (File.Exists(file))
{
Console.WriteLine(file);
//实现wordapp.document接口,打开word
msWord.Document doc = app.Documents.Open(file);
//获取word全文为字符串,没用上
//string temp = doc.Content.Text.Trim();
//遍历所有段落,注意要从1开始,paragraph从1开始而不是从0!!
//for (int i = 1; i <= doc.Paragraphs.Count; i++)
//{
// Console.WriteLine(doc.Paragraphs[i].Range.Text);
//}
///*
//用foreach循环也可以
foreach (msWord.Paragraph para in doc.Paragraphs)
{
foreach (string lA in labelA)
{
//如果段落里包含标题1的文字
if (para.Range.Text.Contains(lA))
{
//测试一下改颜色
//para.Range.Font.ColorIndex = msWord.WdColorIndex.wdBlue;
para.Range.set_Style("标题 1");
Console.WriteLine("已处理:" + para.Range.Text);
}
else
{
//Console.WriteLine(para.Range.Text + "不包含" + lA);
}
}
foreach (string lB in labelB)
{
//如果段落里包含标题1的文字
if (para.Range.Text.Contains(lB))
{
para.Range.set_Style("副标题");
para.Range.ParagraphFormat.Alignment = msWord.WdParagraphAlignment.wdAlignParagraphLeft;
Console.WriteLine("已处理:" + para.Range.Text);
}
else
{
//Console.WriteLine(para.Range.Text + "不包含" + lB);
}
}
}
//*/
doc.Save();
doc.Close(true);
}
else
{
MessageBox.Show(file + " ,word文件不存在!");
}
}
} else
{
MessageBox.Show(txtBox.Text + "文件夹不存在!");
}
app.Quit();
MessageBox.Show("修改完毕!");
} private List<string> GetFile(string path)
{
//获取所有目录包括子目录的文件
//传入一个路径
List<string> list = new List<string>();
//如果路径是文件夹,继续遍历,把新遍历出来的文件夹和文件存到list,用了递归
if (Directory.Exists(path))
{
string[] dirs = Directory.GetDirectories(path);
if (dirs != null)
{
foreach (string dir in dirs)
{
list.AddRange(GetFile(dir));
}
} string[] files = Directory.GetFiles(path);
if (files != null)
{
list.AddRange(files);
}
}
//如果路径是文件,添加到list
else if (File.Exists(path))
{
list.Add(path);
}
return list;
} private void btnSelect_DragEnter(object sender, DragEventArgs e)
{
//拖进文件夹,获取信息
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.All;
else
e.Effect = DragDropEffects.None;
} private void btnSelect_DragDrop(object sender, DragEventArgs e)
{
//拖动松手后,获得路径
string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue().ToString(); //获得路径
txtBox.Text = path;
} private void btnSelect_Click(object sender, EventArgs e)
{
//选择文件夹
//FolderBrowserDialog fbd = new FolderBrowserDialog();
//fbd.SelectedPath = @"c:\";
//if (fbd.ShowDialog() == DialogResult.OK)
//{
// txtBox.Text = fbd.SelectedPath;
//}
//选择文件
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
//C:\Users\JJW\Desktop\新建文件夹\1_负数的引入.doc
txtBox.Text = ofd.FileName;
}
} }
}

设计器:

结束。

C#学习笔记(33)——批量修改word标题的更多相关文章

  1. 利用python批量修改word文件名的方法示例

    利用python批量修改word文件名的方法示例 最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完 ...

  2. 怎么批量修改Word表格的宽度

    怎么批量修改Word表格的宽度 怎么批量修改Word表格的宽度呢.Word表格可根据窗口自动调整表格宽度,使得所有的表格宽度和页面宽度一样.当页面设置了新的页边距后,所有的表格都需要调整新的宽度.或者 ...

  3. [原创]java WEB学习笔记33:Session 案例 之 购物车

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. SpringBoot学习笔记-Chapter2(hello word)

    开篇 第一次在博客园上写博客,初衷是想记录一下学习笔记,以往都是用笔去记录下学习笔记,现在来看在效率.检索速度上以及可可复制性都不好.作为一名Java开发人员 不会Spring Boot一定会被鄙视的 ...

  5. 批量修改WORD表格属性

    有时候需要对word中很多表格的属性进行修改,而word无法批量修改属性,所有这里记录一个宏 Sub TableFormatter() Dim oTbl As Table, i As Integer ...

  6. python批量修改word文件名

    最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完毕的文件的文件名全丢了,所有的文件只有代号,如下面 ...

  7. Linux下汇编语言学习笔记33 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. Keras学习笔记一:修改数据读入方式为本地图片读入

    第一种方法: Keras官方给的图片去噪示例要自动下载mnist数据集并处理,不能修改和加入自己的数据集. from keras.datasets import mnist (x_train, _), ...

  9. 【Git学习笔记】撤销修改

    工作区下的.git文件夹其实是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为 stage 的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向master的一个 ...

随机推荐

  1. 中间人攻击工具mitmf(另类的XSS注入攻击)

    中间人攻击工具mitmf(另类的XSS注入攻击) (一)简介 (二)安装 (三)结合beef使用 (一)简介 Mitmf 是一款用来进行中间人攻击的工具.它可以结合 beef 一起来使用,并利用 be ...

  2. IntelliJ IDEA关于logger的live template配置

    1.安装 log support2插件 2.配置log support2 由于项目中的日志框架是公司自己封装的,所以还需要自己手动改一下 log support2插件生成的live template ...

  3. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-3 蒙特卡罗 (三)

    开学人倍忙,趁着第二周周末,我们继续图形相关的博客  Preface 今天我们来介绍一些理论方面的东西,为Monte Carlo 应用到我们的光线追踪器做铺垫 我们今天会介绍两章的东西,因为有一章内容 ...

  4. 50 tips of JavaScript,这些坑你都知道吗?

    1.在局部作用域中,使用var操作符定义的变量将成为定义该变量的作用域中的局部变量,省略var的会创建全局变量:在全局作用域中,不管是否使用var操作符定义的变量都会创建一个全局变量.但是,在全局作用 ...

  5. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow

    To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ...

  6. 深港DJ好听的歌曲

    好听女声 Dj陈爷-全中文全国语慢歌连版音乐挑选磁性女声翻唱慢摇串烧 http://www.vvvdj.com/play/154270.html DjPad仔-全中文国粤语Rnb音乐清风主流吃鸡学猫叫 ...

  7. 淘宝bug bug bug

    手机淘宝(苹果版)出现了一个挺耀眼的bug...... 待评价有九个,如图 点进去评价6个之后,还有三个 再出来,待评价还是有九个. 重新打开,下拉刷新都不能改变

  8. ES6语法篇(其一)

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/es6-grammar-part-one/ 一.let命令 基本用法:ES ...

  9. 【BZOJ3036】绿豆蛙的归宿 概率DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  10. [JS]两个常用的取随机整数的函数

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...