NPOI2.1.1版在2014年6月已发布,但对于word的操作还是不尽人意,如何利用NPOI在docx中插入图表方面网上几乎没有。经过对docx文件中插入图表的xml分析,对NPOI2.1.1源码进行了插入图表方面的修改,实现了inline和anchor两种方式的图表插入。
一、docx插入图表与inline和anchor关系
与docx插图方式一样,用inline方式插入的图表位置不能灵活控制,只能通过段设置,对应word的嵌入型插入图表。用anchor方式插入的图表位置能灵活控制,对应word的四周型、紧密型、穿越型等。
二、docx文件中插入图表的xml分析
docx插入图表的所有信息都包含在word文件夹中,文件夹中有document.xml文件、embeddings、charts和_rels文件夹。图表原始数据以xlsx文件格式存储在embeddings文件夹中,每一张图表对应一个xlsx文件。charts文件夹存储定义每张图表的chartn.xml文件及_rels文件夹,每个定义图表的chartn.xml文件通过_reles文件夹中对应的chartn.xml.rels文件建立图表与对应的xlsx文件关联。在_rels文件夹中的document.xml.rels文件对插入图表定义了以"rId"+数字组成的标识与图表关联。document.xml文件则存储着插入图表等的xml信息。
三、修改NPOI2.1.1源码 NPOI中的OpenXmlFormats提供了较为完善的图表插入所有功能,但在XWPF中没有提供插入图表的方法。因此在XWPFRun类中增加了inline和anchor方式的AddChartSpace两个方法,实现AddChartSpace两个方法的代码由于较长,在此不列举。假如对图表操作较为熟悉,也可以不用提供的AddChartSpace方法实现docx插入图表。
XWPFDocument m_Docx = new XWPFDocument();
//插入图表(饼图)
//创建xlsx
XSSFWorkbook workbook = new XSSFWorkbook();
//创建表单1(饼图)
ISheet sheet = workbook.CreateSheet("Sheet1");
//表单1饼图数据
// 销售额
//第一季度 8.2
//第二季度 3.2
//第三季度 1.4
//第四季度 1.2
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell = row.Creat