说明(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. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

  2. 关于Maven打包Java Web项目以及热部署插件Jrebel的使用

    Java Web/Eclipse/Maven/Tomcat 最近有个新项目是java web项目,记录一下,可能比较乱.虽然没接触过Java,但是eclipse还是用过的 初识项目 同事说,项目是ma ...

  3. 从源码看Spring Boot 2.0.1

    Spring Boot 命名配置很少,却可以做到和其他配置复杂的框架相同的功能工作,从源码来看是怎么做到的. 我这里使用的Spring Boot版本是 2.0.1.RELEASE Spring Boo ...

  4. Stream 与 byte[] 互转

    public byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(byt ...

  5. 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)

    打开图形界面  18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...

  6. javascript加密PHP解密---jsencrypt

    今天偶然发现jsencrypt这玩意,之前做"直播室聊天"时 数据传输明文问题没解决; 一直苦苦寻找技术解决方案今天勉强找了个: 原理:javascript加密PHP解密: 完全依 ...

  7. FTP和TCP的文件传输效率对比测试分析

    前言 最近因项目需要,需要把一定数量的中等文件从开发板上传到电脑上,分别选择了FTP和TCP自定义协议两种方式进行传输,进行了简单的对比测试,故做如下记录. 测试环境 开发板:Linux,ARMv7 ...

  8. AngualrJS中制作一个有关菜单的Directive

    通常我们这样写一个菜单: <ul> <li data-ng-class="{'active': highlight('/orders')}"> <a ...

  9. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  10. Linux下批量修改文件名(rename)

    原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修 ...