c# docx格式word文档导入

在我们的项目中,大多的时候,我们都是进行的excel的导入和导出工作。而对于word的导入和导出操作,就比较少了。今天,我们以简历的导入为例子,简要说明下获取word内容进行导入的方法,简历的模板如下。

根据模板,我们可以看到此文档内容分为几个明显的块。“基本信息”之上的内容可以看成是一个表格,只是没有边界显示出来而已。而其之下是一个可见边界的表格,之后的内容都基本是已这种方式展示的。

核心代码如下

DirectoryInfo dir = new DirectoryInfo(selectedPath);  //selectedPath是docx文件夹路径

var pathTemp = string.Empty;
var fileName = string.Empty;
                       
var lstData = new List<Model>();
foreach (FileInfo fi in dir.GetFiles("*.docx"))
{
    g_doc = fi.FullName;
    using (WordprocessingDocument doc = WordprocessingDocument.Open(fi.FullName, false))
    {
        List<Table> tbls = doc.MainDocumentPart.Document.Body.Elements<Table>().ToList();
        Model rs = new Model();
        rs.StudentName = tbls[1].Elements<TableRow>().ToArray()[3].Elements<TableCell>().ToArray()[2].Elements<Paragraph>().First().InnerText;

        var birth = tbls[2].Elements<TableRow>().ToArray()[0].Elements<TableCell>().ToArray()[3].Elements<Paragraph>().First().InnerText;
        if (!string.IsNullOrEmpty(birth))
        {
            rs.Birthday = DateTime.Parse(birth);
        }
        rs.Gender = tbls[2].Elements<TableRow>().ToArray()[0].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;
        rs.IdCard = tbls[2].Elements<TableRow>().ToArray()[1].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;

        rs.InterviewCity = tbls[2].Elements<TableRow>().ToArray()[2].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;

        rs.Email = tbls[2].Elements<TableRow>().ToArray()[3].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;
        rs.Mobile = tbls[2].Elements<TableRow>().ToArray()[3].Elements<TableCell>().ToArray()[3].Elements<Paragraph>().First().InnerText;
        rs.Address = tbls[2].Elements<TableRow>().ToArray()[4].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;

        rs.Degree = tbls[3].Elements<TableRow>().ToArray()[0].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;

        var year = tbls[3].Elements<TableRow>().ToArray()[0].Elements<TableCell>().ToArray()[3].Elements<Paragraph>().First().InnerText;
        if (!string.IsNullOrEmpty(year))
        {
            rs.EndYear = DateTime.Parse(year).Year;
        }

        rs.School = tbls[3].Elements<TableRow>().ToArray()[1].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;
        rs.SectionAndDepartment = tbls[3].Elements<TableRow>().ToArray()[2].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;
        rs.Major = tbls[3].Elements<TableRow>().ToArray()[2].Elements<TableCell>().ToArray()[3].Elements<Paragraph>().First().InnerText;
        rs.SchoolLow = tbls[3].Elements<TableRow>().ToArray()[3].Elements<TableCell>().ToArray()[3].Elements<Paragraph>().First().InnerText;
        rs.IsFlag = tbls[3].Elements<TableRow>().ToArray()[5].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText == "是" ? 1 : 0;

        var titleContent = tbls[5].Elements<TableRow>().ToArray()[0].Elements<TableCell>().ToArray()[0].Elements<Paragraph>().First().InnerText;
        
        rs.KeyWord = tbls[tbls.Count - 2].Elements<TableRow>().ToArray()[1].Elements<TableCell>().ToArray()[1].Elements<Paragraph>().First().InnerText;

        lstData.Add(rs);
    }
}

由代码可以看出,我们要得到学上的姓名这一内容,其在最顶部“无边界”中出现。而如果代码中给出的是tbls[1].Elements<TableRow>(),由此可见这里的索引不是从0开始的。而从完整的代码tbls[1].Elements<TableRow>().ToArray()[3].Elements<TableCell>().ToArray()[2].Elements<Paragraph>().First().InnerText;中可看出,从“个人编号”开始,“姓名”是在第四个位置,而给出的索引是3,所以这个地方的索引0开始计算的。而接下来直接获得内容部分的索引也是从0开始计算的。如果从这个地方看不出,可以参考下面的性别等内容的获取方式进行对比即可知道。

其中的Model为导入的模型类,基本和导入表的字段内容一致,实际使用中需要根据需要进行调整。

这里有一个比较有意思的地方是“学生实践经验”,这里我们想把多个实践的时间和内容拼接到一起,所以给出了以下demo。

private string GetProject(List<Table> tbls, int idx)
{
   StringBuilder sb = new StringBuilder();
   var rows = tbls[idx].Elements<TableRow>().ToArray();
   var k = rows.Length;
   for (int i = 0; i < k / 2; i++)
   {
       var cells = rows[i * 2].Elements<TableCell>().ToArray();
       string bdat = cells[1].Elements<Paragraph>().First().InnerText;
       string edat = cells[3].Elements<Paragraph>().First().InnerText;
       var cells2 = rows[i * 2 + 1].Elements<TableCell>().ToArray();
       string content = cells2[1].Elements<Paragraph>().First().InnerText;
       sb.AppendLine(string.Format("{0}~{1}", bdat, edat));
       sb.AppendLine(string.Format("{0}", content));
    }
    return sb.ToString();
}

其中,第二个参数idx表示“学生实践经验”在整个word文档中的索引值。

以上内容仅仅给出了word导入的一个基本思路,关于数据库相关的操作,这里就不多说啦。大家可以根据自己使用的数据库进行相应代码编写即可。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值