在我们的项目中,大多的时候,我们都是进行的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导入的一个基本思路,关于数据库相关的操作,这里就不多说啦。大家可以根据自己使用的数据库进行相应代码编写即可。