C#读取word中表格数据的方法实现
作者:ViperL1 发布时间:2023-09-12 22:54:53
标签:C#,读取,word
前些日子有一个项目需要从word文件中取表格数据并进行处理,网上大部分方案都是基于office的com组件实现,但是这样有一个缺点,如果电脑里没有安装office将无法使用,因为之前操作excel都是使用的NPOI,所以理所当然的想用NPOI解决此问题。
于是找到了如下代码
private List<string> GetDoc(string Path)
{
if (Path == "")
return null; //文件路径为空
List<string> Result = new List<string>(); //结果容器
FileStream stream = new FileStream(Path, FileMode.Open); //打开流
XWPFDocument docx = new XWPFDocument(stream);
var list = new List<XWPFTableCell>();
//循环遍历表格内容
foreach (var row in docx.Tables[0].Rows)
{
foreach (var cell in row.GetTableCells())
{
if (!list.Contains(cell))
{
list.Add(cell);
Result.Add(cell.GetText());
}
}
}
stream.Close();
return Result; //关闭文件流(很关键,否则会导致下一个文件无法大开)
}
但是这样做又有一个缺点 ,NPOI仅支持.docx格式的文件,如果读取.doc会直接报错!
于是后续又找到了另一开源组件freeSpire。有如下代码
private List<string> GetDocX(string Path)
{
if (Path == "")
return null; //文件路径为空
List<string> Result = new List<string>();
Spire.Doc.Document doc = new Spire.Doc.Document();
doc.LoadFromFile(Path);
TextBox textbox = doc.TextBoxes[0];
Spire.Doc.Table table = textbox.Body.Tables[0] as Spire.Doc.Table;
foreach (TableRow row in table.Rows)
{
foreach (TableCell cell in row.Cells)
{
foreach (Paragraph paragraph in cell.Paragraphs)
{
Result.Add(paragraph.Text);
}
}
}
return Result;
}
但是不知道什么原因,并不能抓取.doc文件中的表格。
随后尝试了其getText()函数确定可以直接抓取文字内容,初步判断可能是格式问题。
有考虑过自己写匹配函数对文本内容进行分析,但由于格式过于复杂,很多通用性问题无法解决后放弃。如果格式不复杂的话,也不失为一种解决方法。
最后采用的方法是先利用Spire组件将.doc转换为.docx后再利用NPOI进行内容处理,效果拔群!!!
private string ChangeToDocx(string Path)
{
if (Path == "")
return ""; //文件路径为空
List<string> Result = new List<string>();
Spire.Doc.Document doc = new Spire.Doc.Document();
doc.LoadFromFile(Path); //打开文件
Path.Replace(".doc", "docx"); //替换后缀
doc.SaveToFile(Path, FileFormat.Docx); //保存为.doc
return Path;
}
主函数中调用如下:(若不是.doc则无需转换以节约开销)
if (Path.Contains(".doc"))
{
string newPath = ChangeToDocx(Path);
result = GetDoc(newPath);
}
result = GetDoc(Path);
来源:https://blog.csdn.net/weixin_37878740/article/details/125230980


猜你喜欢
- 前言最近在学习Spring Boot结合Redis时看了一些网上的教程,发现这些教程要么比较老,要么不知道从哪抄得,运行起来有问题。这里分享
- 1. 前言我们往往有些配置文件,当项目大的时候,一些配置文件或者一些判断逻辑就会变得复杂,会出现很多判断语句,我在想,能不能通过前缀拼接动态
- 在Spring Boot集成Mybatis的项目中,如果出现SQL语句执行问题,我们需要进行排查。此时就需要打印对应的SQL语句,那么该如何
- 前言目前正在练手springboot+vue,因为很多步骤会遇到困难,当时查完资料解决,过一段时间就会忘记,所以决定建个系列记录下来。因为中
- 之前在做分页时,很多朋友都是用Jquery分页插件,之前我就用的jquery.paper,有需要的朋友可以联系我,接下来小编给大家分享用Jq
- 本文实例讲述了C#实现对文件进行加密解密的方法。分享给大家供大家参考。具体如下:using System;using System.IO;u
- Java注解介绍基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,
- 本文实例讲述了Java抛出异常与自定义异常类。分享给大家供大家参考,具体如下:异常处理常用方法:常用的异常处理方法有:一、try()catc
- 一个真实的故事大学的时候就开过一门课程,讲设计模式,可是大学生没什么编程实践经验,在大学里面听设计模式的感觉,就像听天书。听着都有道理,可是
- checked 和 unchecked关键字用来限定检查或者不检查数学运算溢出的;如果使用了checked发生数学运算溢出时会抛出Overf
- 运用到的MongoDB支持的C#驱动,当前版本为1.6.0下载地址:https://github.com/mongodb/mongo-csh
- public class PersonAdapter extends BaseAdapter { private List per
- 一、首先我们先创建一个Maven项目把我们需要的包先准备好 1.打开pom.xml文件引入依赖,以下是整个pom.xml文件<
- 一、实战-内存溢出堆内存溢出栈内存溢出方法区溢出直接内存溢出二、实战-堆内存溢出演示堆内存溢出代码,并且定位问题总结堆内存溢出的场景与解决方
- 本文主要学习Java构造器与传值,供大家参考,具体内容如下构造器构造器介绍构造器是Java学习中一个很重要的概念,每个类的对象在使用关键字n
- 一、实验目的1. 掌握各种高级UI控件的基本使用;2. 能够实现Tab切换效果。二、实验任务1. 根据原型图设计界面;2. 实现Tab切换;
- 本文实例为大家分享了C语言实现代码雨效果的具体代码,供大家参考,具体内容如下一、项目描述和最终的效果展示项目: 让字符从上到下
- 大家好,我叫柠檬水,今天马上就要放假,突然想到自己以前的伙伴、同学,好像想到他们空间没怎么发过动态,难道是把我屏蔽了吗,好友又那么多,行吧,
- 详解 Java中日期数据类型的处理之格式转换的实例概要:日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar
- 前言项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方