word 和 excel 是两种完全不同的文件类型,word 文档是用来写文章、写信或者制作报告的,而 excel 文档则是以表格的形式保存数据,制作图表或者进行数学运算等,不建议将复杂的 word 文档转成 excel 表格,因为 excel 很难按照 word 中原有的布局来呈现内容。
但是如果你的 word 文档中大部分是由表格组成,并且你想要在 excel 中分析表格数据的话,可以使用将 word 转为 excel,并且保持很好的可读性。在本文中,我们将演示如何使用 spire. doc for .net 和 spire.xls for .net 在 c# 中将 word 转为 excel。
安装 spire.doc for .net 与 spire.xls for .net
首先,您需要将 spire.doc for.net 与 spire.xls for.net 包含的 dll 文件作为引用添加到您的 .net 项目中。
spire.doc for.net 的 dll 文件可以从此链接下载,也可以通过 安装。
pm> install-package spire.doc
spire.xls for.net 的 dll 文件可以从此链接下载,也可以通过 安装。
pm> install-package spire.xls
将 word 文档转为 excel 文档
实现这个功能时,使用 spire.doc for .net 读取和提取 word 文档中的内容,使用 spire.xls for .net 创建 excel 文档并在特定单元格中写入数据。为了使这个代码示例易于理解,创建了以下三个执行特定功能的自定义方法。
- exporttableinexcel() - 将 word 表格的数据导出到指定的 excel 单元格。
- copycontentintable() - 从 word 中的一个表格单元格复制内容到 excel 单元格。
- copytextandstyle() - 从 word 段落复制带有格式的文本到 excel 单元格。
以下步骤演示了如何使用 spire.doc for .net 和 spire.xls for .net 将整个 word 文档的数据导出到 excel 工作表中:
- 创建一个 document 对象来加载 word 文件。
- 创建一个 worbook 对象并向其中添加一个名为 "wordtoexcel" 的工作表。
- 遍历 word 文档中的所有部分,遍历每个部分下的所有文档对象,然后确定文档对象是段落还是表格。
- 如果文档对象是一个段落,则使用 copytextandstyle() 方法在 excel 中的指定单元格写入段落。
- 如果文档对象是一个表格,则使用 exporttableinexcel() 方法将 word 中的表格数据导出到 excel 单元格。
- 使用 worksheet.allocatedrange.autofitrows() 方法和 worksheet.allocatedrange.autofitcolumns() 方法来自动调整 excel 中的行高和列宽,以便单元格内的数据不会超出单元格的边界。
- 使用 workbook.savetofile()方法将工作簿保存为 excel 文件。
- c#
using spire.doc.documents;
using spire.doc;
using spire.xls;
using spire.doc.fields;
using system.drawing;
namespace wordtoexcel
{
internal class program
{
static void main(string[] args)
{
// 创建一个document对象
document doc = new document();
// 从指定路径加载word文档
doc.loadfromfile(@"../../data/tablesample.docx");
// 创建一个workbook对象
workbook wb = new workbook();
// 清除工作簿中的所有工作表
wb.worksheets.clear();
// 在工作簿中创建一个名为"wordtoexcel"的空工作表
worksheet worksheet = wb.createemptysheet("wordtoexcel");
// 初始化行和列的计数器
int row = 1;
int column = 1;
// 遍历文档中的每个section
foreach (section section in doc.sections)
{
// 遍历section中的每个documentobject
foreach (documentobject documentobject in section.body.childobjects)
{
// 如果当前documentobject是一个段落
if (documentobject is paragraph)
{
// 获取当前单元格范围
cellrange cell = worksheet.range[row, column];
// 将documentobject转换为paragraph类型
paragraph paragraph = documentobject as paragraph;
// 调用copytextandstyle方法将段落文本和样式复制到单元格
copytextandstyle(cell, paragraph);
// 行计数器递增
row ;
}
// 如果当前documentobject是一个表格
if (documentobject is table)
{
// 将documentobject转换为table类型
table table = documentobject as table;
// 调用exporttableinexcel方法将表格导出到excel,并返回新的行数
int currentrow = exporttableinexcel(worksheet, row, table);
// 更新行计数器
row = currentrow;
}
}
}
// 自动调整工作表中所有行的宽度
worksheet.allocatedrange.autofitrows();
// 自动调整工作表中所有列的宽度
worksheet.allocatedrange.autofitcolumns();
// 设置工作表中所有单元格的文本自动换行
worksheet.allocatedrange.iswraptext = true;
// 将工作簿保存为excel文件,版本为2013
wb.savetofile(@"../../output/wordtoexcel1.xlsx", excelversion.version2013);
}
// 定义一个私有静态方法,用于将表格导出到excel工作表
private static int exporttableinexcel(worksheet worksheet, int row, table table)
{
// 定义一个单元格范围变量
cellrange cell;
// 定义一个列计数器变量
int column;
// 遍历表格的每一行
foreach (tablerow tbrow in table.rows)
{
// 初始化列计数器为1
column = 1;
// 遍历当前行的每一个单元格
foreach (tablecell tbcell in tbrow.cells)
{
// 获取当前word表格单元格对应的excel单元格范围
cell = worksheet.range[row, column];
// 设置单元格边框样式
cell.borderaround(linestyletype.thin, color.black);
// 调用自定义方法copycontentintable来复制单元格内容到excel单元格
copycontentintable(tbcell, cell);
// 列计数器递增
column ;
}
// 行计数器递增
row ;
}
// 返回更新后的行计数器值
return row;
}
// 定义一个私有静态方法,用于复制表格单元格的内容到excel单元格
private static void copycontentintable(tablecell tbcell, cellrange cell)
{
// 创建一个新的段落对象,用于存储复制的内容
paragraph newpara = new paragraph(tbcell.document);
// 遍历表格单元格的子对象
for (int i = 0; i < tbcell.childobjects.count; i )
{
// 获取当前子对象
documentobject documentobject = tbcell.childobjects[i];
// 如果子对象是段落类型
if (documentobject is paragraph)
{
// 将子对象转换为段落类型
paragraph paragraph = documentobject as paragraph;
// 遍历段落的子对象
foreach (documentobject cobj in paragraph.childobjects)
{
// 将子对象克隆并添加到新段落中
newpara.childobjects.add(cobj.clone());
}
// 如果不是最后一个子对象,添加换行符
if (i < tbcell.childobjects.count - 1)
{
newpara.appendtext("\n");
}
}
}
// 复制文本和样式到excel单元格
copytextandstyle(cell, newpara);
}
// 定义一个私有静态方法,用于复制文本和样式到excel单元格
private static void copytextandstyle(cellrange cell, paragraph paragraph)
{
// 获取单元格的富文本对象
richtext richtext = cell.richtext;
// 设置富文本对象的文本内容
richtext.text = paragraph.text;
// 定义起始索引变量
int startindex = 0;
// 遍历段落的子对象
foreach (documentobject documentobject in paragraph.childobjects)
{
// 如果子对象是文本范围类型
if (documentobject is textrange)
{
// 将子对象转换为文本范围类型
textrange textrange = documentobject as textrange;
// 获取文本格式信息(字体名称、是否加粗、文本颜色、字体大小、文本内容、文本长度)
string fontname = textrange.characterformat.fontname;
bool isbold = textrange.characterformat.bold;
color textcolor = textrange.characterformat.textcolor;
float fontsize = textrange.characterformat.fontsize;
string textrangetext = textrange.text;
int strlength = textrangetext.length;
// 创建一个新的字体对象
excelfont font = cell.worksheet.workbook.createfont();
// 设置字体属性
font.color = textcolor;
font.isbold = isbold;
font.size = fontsize;
font.fontname = fontname;
// 计算结束索引
int endindex = startindex strlength;
// 设置富文本对象的字体样式
richtext.setfont(startindex, endindex, font);
// 更新起始索引
startindex = strlength;
}
// 如果子对象是图片类型
if (documentobject is docpicture)
{
// 将子对象转换为图片类型
docpicture picture = documentobject as docpicture;
// 将图片添加到工作表中的指定位置
cell.worksheet.pictures.add(cell.row, cell.column, picture.image);
// 设置行高以适应图片高度
cell.worksheet.setrowheightinpixels(cell.row, 1, picture.image.height);
}
}
// 根据段落的水平对齐方式设置单元格的水平对齐方式
switch (paragraph.format.horizontalalignment)
{
case horizontalalignment.left:
cell.style.horizontalalignment = horizontalaligntype.left;
break;
case horizontalalignment.center:
cell.style.horizontalalignment = horizontalaligntype.center;
break;
case horizontalalignment.right:
cell.style.horizontalalignment = horizontalaligntype.right;
break;
}
}
}
}
申请临时 license
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用javascript。获取有效期 30 天的临时许可证。