您当前的位置: 首页 >  c#

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

c# docx格式word文档导入

寒冰屋 发布时间:2019-10-18 15:47:34 ,浏览量:1

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

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

核心代码如下

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

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

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

        rs.InterviewCity = tbls[2].Elements().ToArray()[2].Elements().ToArray()[1].Elements().First().InnerText;

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

        rs.Degree = tbls[3].Elements().ToArray()[0].Elements().ToArray()[1].Elements().First().InnerText;

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

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

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

        lstData.Add(rs);
    }
}

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

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

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

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

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

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

 

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0484s