是使用NPOI操作word生成数据模板时,遇到创建柱形图的需求,本篇记录创建双柱或者多柱的方式,下一篇记录单柱形图,在制作单柱形图时需要注意一些地方的改动才能更好的展示。代码是经过复制+黏贴+反复调整勉强可实现功能,具体里面的细节并没有深入研究。
结果图:
XWPFDocument m_Docx = new XWPFDocument();
//测试数据格式
// string jsonstring = "{report:[{sex:'男',data:[{name:'20-30',num:2},{name:'30-40',num:4},{name:'40-50',num:6},{name:'50-60',num:7},{name:'60-70',num:9} ] }," +
//"{sex:'女',data:[ {name:'20-30',num:4}, {name:'30-40',num:5}, {name:'40-50',num:6}, {name:'50-60',num:3},{name:'60-70',num:2}]}]}";
string jsonstring=Common.PubVars.tableMw;
JObject jsono = JObject.Parse(jsonstring);
XSSFWorkbook workbook = new XSSFWorkbook();
//将xlsx数据转为btye,因为在插入第一张图表后workbook流会关闭
MemoryStream msxlsxData = new MemoryStream();
workbook.Write(msxlsxData);
msxlsxData.Flush();
byte[] bxlsxData = msxlsxData.ToArray();
//简单柱状图chartn.xml内容
CT_ChartSpace ctbarchartspace0 = new CT_ChartSpace();
ctbarchartspace0.date1904 = new CT_Boolean();
ctbarchartspace0.date1904.val = 1;
ctbarchartspace0.lang = new CT_TextLanguageID();
ctbarchartspace0.lang.val = "zh-CN";
//--
CT_Chart m_chart = ctbarchartspace0.AddNewChart();
//--------1---------++
//图表标题
m_chart.title = new CT_Title();
m_chart.title.tx = new CT_Tx();
m_chart.title.tx.rich = new CT_TextBody();
m_chart.title.tx.rich.AddNewBodyPr();
m_chart.title.tx.rich.AddNewLstStyle();
m_chart.title.tx.rich.p = new List<NPOI.OpenXmlFormats.Dml.CT_TextParagraph>();
NPOI.OpenXmlFormats.Dml.CT_TextParagraph charttp = new NPOI.OpenXmlFormats.Dml.CT_TextParagraph();
charttp.AddNewPPr().defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties();
NPOI.OpenXmlFormats.Dml.CT_RegularTextRun r = charttp.AddNewR();
r.rPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties();
r.rPr.lang = "zh-CN";
r.rPr.altLang = "en-US";
r.t = "";//设置标题
m_chart.title.tx.rich.p.Add(charttp);
m_chart.title.overlay = new CT_Boolean();
m_chart.title.overlay.val = 0;
m_chart.autoTitleDeleted = new CT_Boolean();
m_chart.autoTitleDeleted.val = 0;
m_chart.plotArea = new CT_PlotArea();
m_chart.plotArea.barChart = new List<CT_BarChart>();
CT_BarChart m_barchart0 = new CT_BarChart();
m_barchart0.barDir = new CT_BarDir();
m_barchart0.barDir.val = ST_BarDir.col;
m_barchart0.grouping = new CT_BarGrouping();
m_barchart0.grouping.val = ST_BarGrouping.clustered;
m_barchart0.ser = new List<CT_BarSer>();
JArray ja = (JArray)jsono["report"];
for (int i = 0; i < ja.Count; i++)
{
JObject json = (JObject)ja[i];
string sexstr = json.GetValue("sex").ToString();
CT_BarSer m_barser = new CT_BarSer();
m_barser.idx = new CT_UnsignedInt();
m_barser.idx.val = (uint)i;
m_barser.order = new CT_UnsignedInt();
m_barser.order.val = (uint)i;
m_barser.tx = new CT_SerTx();
m_barser.tx.strRef = new CT_StrRef();
m_barser.tx.strRef.f = "Sheet1!$B$1";
m_barser.tx.strRef.strCache = new CT_StrData();
m_barser.tx.strRef.strCache.ptCount = new CT_UnsignedInt();
m_barser.tx.strRef.strCache.ptCount.val = 1;
m_barser.tx.strRef.strCache.pt = new List<CT_StrVal>();
CT_StrVal m_barpt1 = new CT_StrVal();
m_barpt1.idx = 0;
m_barpt1.v = sexstr;
m_barser.tx.strRef.strCache.pt.Add(m_barpt1);
//分类标题显示
m_barser.invertIfNegative = new CT_Boolean();
m_barser.invertIfNegative.val = 0;
m_barser.cat = new CT_AxDataSource();
m_barser.cat.strRef = new CT_StrRef();
m_barser.cat.strRef.f = "Sheet1!$A$2:$A$5";
m_barser.cat.strRef.strCache = new CT_StrData();
m_barser.cat.strRef.strCache.ptCount = new CT_UnsignedInt();
m_barser.cat.strRef.strCache.ptCount.val = 4;
m_barser.cat.strRef.strCache.pt = new List<CT_StrVal>();
m_barser.val = new CT_NumDataSource();
m_barser.val.numRef = new CT_NumRef();
m_barser.val.numRef.f = "Sheet1!$B$2:$B$5";
m_barser.val.numRef.numCache = new CT_NumData();
m_barser.val.numRef.numCache.formatCode = "General";
m_barser.val.numRef.numCache.ptCount = new CT_UnsignedInt();
m_barser.val.numRef.numCache.ptCount.val = 4;
m_barser.val.numRef.numCache.pt = new List<CT_NumVal>();
JArray jadata = (JArray)json.GetValue("data");
for (int j = 0; j < jadata.Count; j++)
{
JObject json1 = (JObject)jadata[j];
string name = json1.GetValue("name").ToString();
string num = json1.GetValue("num").ToString();
m_barpt1 = new CT_StrVal();
m_barpt1.idx = (uint)j;
m_barpt1.v = name;
m_barser.cat.strRef.strCache.pt.Add(m_barpt1);
CT_NumVal m_barvalpt1 = new CT_NumVal();
m_barvalpt1.idx = (uint)j;
m_barvalpt1.v = num;
m_barser.val.numRef.numCache.pt.Add(m_barvalpt1);
}
m_barchart0.ser.Add(m_barser);
}
//图表与数据显示设计
m_barchart0.dLbls = new CT_DLbls();
m_barchart0.dLbls.showLegendKey = new CT_Boolean();
m_barchart0.dLbls.showLegendKey.val = 0;
m_barchart0.dLbls.showVal = new CT_Boolean();//值显示设置
m_barchart0.dLbls.showVal.val = 1;
m_barchart0.dLbls.showCatName = new CT_Boolean();//分类显示设置
m_barchart0.dLbls.showCatName.val = 0;
m_barchart0.dLbls.showSerName = new CT_Boolean();//tx标题显示设置
m_barchart0.dLbls.showSerName.val = 0;
m_barchart0.dLbls.showPercent = new CT_Boolean();
m_barchart0.dLbls.showPercent.val = 0;
m_barchart0.dLbls.showBubbleSize = new CT_Boolean();
m_barchart0.dLbls.showBubbleSize.val = 0;
m_barchart0.dLbls.showLeaderLines = new CT_Boolean();
m_barchart0.dLbls.showLeaderLines.val = 0;
m_barchart0.gapWidth = new CT_GapAmount();
m_barchart0.gapWidth.val = 150;
m_barchart0.overlap = new CT_Overlap();
m_barchart0.overlap.val = (sbyte)-25;
//-----------第三个坐标轴---------------
m_barchart0.axId = new List<CT_UnsignedInt>();
CT_UnsignedInt m_axId = new CT_UnsignedInt();
m_axId.val = 57733120;
m_barchart0.axId.Add(m_axId);
m_axId = new CT_UnsignedInt();
m_axId.val = 57734656;
m_barchart0.axId.Add(m_axId);
m_chart.plotArea.barChart.Add(m_barchart0);
m_chart.plotArea.catAx = new List<CT_CatAx>();
CT_CatAx m_catAx = new CT_CatAx();
m_catAx.axId = new CT_UnsignedInt();
m_catAx.axId.val = 57733120;
m_catAx.scaling = new CT_Scaling();
m_catAx.scaling.orientation = new CT_Orientation();
m_catAx.scaling.orientation.val = ST_Orientation.minMax;
m_catAx.delete = new CT_Boolean();//分类标题
m_catAx.delete.val = 0;
m_catAx.axPos = new CT_AxPos();
m_catAx.axPos.val = ST_AxPos.b;
m_catAx.tickLblPos = new CT_TickLblPos();
m_catAx.tickLblPos.val = ST_TickLblPos.nextTo;
m_catAx.crossAx = new CT_UnsignedInt();
m_catAx.crossAx.val = 57733120;
m_catAx.crosses = new CT_Crosses();
m_catAx.crosses.val = ST_Crosses.autoZero;
m_chart.plotArea.catAx.Add(m_catAx);
m_chart.plotArea.valAx = new List<CT_ValAx>();
CT_ValAx m_valAx = new CT_ValAx();
m_valAx.axId = new CT_UnsignedInt();
m_valAx.axId.val = 57734656;
m_valAx.scaling = new CT_Scaling();
m_valAx.scaling.orientation = new CT_Orientation();
m_valAx.scaling.orientation.val = ST_Orientation.minMax;
m_valAx.axPos = new CT_AxPos();
m_valAx.axPos.val = ST_AxPos.l;
m_valAx.majorGridlines = new CT_ChartLines();
m_valAx.numFmt = new NPOI.OpenXmlFormats.Dml.Chart.CT_NumFmt();
m_valAx.numFmt.formatCode = "General";
m_valAx.numFmt.sourceLinked = true;
m_valAx.majorTickMark = new CT_TickMark();
m_valAx.majorTickMark.val = ST_TickMark.none;
m_valAx.minorTickMark = new CT_TickMark();
m_valAx.minorTickMark.val = ST_TickMark.none;
m_valAx.tickLblPos = new CT_TickLblPos();
m_valAx.tickLblPos.val = ST_TickLblPos.nextTo;
m_valAx.crossAx = new CT_UnsignedInt();
m_valAx.crossAx.val = 57733120;
m_valAx.crosses = new CT_Crosses();
m_valAx.crosses.val = ST_Crosses.autoZero;
m_valAx.crossBetween = new CT_CrossBetween();
m_valAx.crossBetween.val = ST_CrossBetween.between;
m_chart.plotArea.valAx.Add(m_valAx);
m_chart.legend = new CT_Legend();
m_chart.legend.legendPos = new CT_LegendPos();
m_chart.legend.legendPos.val = ST_LegendPos.t;//小标题的位置
m_chart.legend.overlay = new CT_Boolean();
m_chart.legend.overlay.val = 0;
m_chart.plotVisOnly = new CT_Boolean();
m_chart.plotVisOnly.val = 1;
m_chart.dispBlanksAs = new CT_DispBlanksAs();
m_chart.dispBlanksAs.val = ST_DispBlanksAs.gap;
m_chart.showDLblsOverMax = new CT_Boolean();
m_chart.showDLblsOverMax.val = 0;
XWPFParagraph gp = m_Docx.CreateParagraph();
XWPFRun gr = gp.CreateRun();
gr.AddChartSpace(new XSSFWorkbook(new MemoryStream(bxlsxData)), ctbarchartspace0, 5274310, 3076575);
//保存文件
string docPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "DocxWord");
if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); }
string fileName = string.Format("{0}.doc", DateTime.Now.ToString("yyyyMMddHHmmssfff"));
FileStream out1 = new FileStream(Path.Combine(docPath, fileName), FileMode.Create);
m_Docx.Write(out1);
out1.Close();
收集的使用NPOI操作word的文档,还是比较适用的文档 https://download.csdn.net/download/dengxt/10823924