2

我必须从数据表中将数据导出到 Excel 表,并且我需要在同一张表中显示折线图。我的问题是如何在同一张表中显示数据和图表。

我正在使用 NPOI 库版本 1.2.5.0 和 dotnet 2.0我已经设法使用 NPOI 库以这种方式将数据从数据表中导出到 excel 中。这是我的示例代码。

class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("First Name", typeof(string));
            dt.Columns.Add("Last Name", typeof(string));
            dt.Columns.Add("Salary", typeof(double));

            DataRow dr = null;
            dr = dt.NewRow();
            dr[0] = "Konna";
            dr[1] = "Lombard";
            dr[2] = "3000";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = "Tunip";
            dr[1] = "Mansar";
            dr[2] = "4000";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = "Dobby";
            dr[1] = "Bhell";
            dr[2] = "5000";
            dt.Rows.Add(dr);

            Utility.Export(dt, "Result");

        }
    }

public static class Utility
    {
        public static string GetParentDirectory()
        {
            System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
            return myDirectory.Parent.Parent.FullName;
        }

        public static void Export( DataTable dt,string strSheetName)
        {
            try
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(strSheetName);
                HSSFRow headerRow = (HSSFRow) sheet.CreateRow(0);

                IFont font = workbook.CreateFont();
                font.FontHeightInPoints = 14;
                font.FontName = "Calibri";
                font.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;

                ICell titleCell = headerRow.CreateCell(0);
                titleCell.SetCellValue("Daily Finished Job History " + DateTime.Now.ToString("dd/MM/yyyy"));
                titleCell.CellStyle = workbook.CreateCellStyle();
                titleCell.CellStyle.SetFont(font);
                sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count));

                int rowIndex = 2;
                HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
                foreach (DataColumn column in dt.Columns)
                {
                    font = workbook.CreateFont();
                    font.FontHeightInPoints = 11;
                    font.FontName = "Calibri";
                    font.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;

                    titleCell = dataRow.CreateCell(column.Ordinal);
                    titleCell.SetCellValue(column.ColumnName);
                    titleCell.CellStyle = workbook.CreateCellStyle();
                    titleCell.CellStyle.SetFont(font);

                    sheet.AutoSizeColumn(column.Ordinal);
                }
                rowIndex = 3;

                foreach (DataRow row in dt.Rows)
                {
                    dataRow = (HSSFRow)sheet.CreateRow(rowIndex);

                    foreach (DataColumn column in dt.Columns)
                    {
                        font = workbook.CreateFont();
                        font.FontHeightInPoints = 11;
                        font.FontName = "Calibri";
                        font.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.NORMAL;

                        titleCell = dataRow.CreateCell(column.Ordinal);
                        titleCell.SetCellValue(row[column].ToString());
                        titleCell.CellStyle = workbook.CreateCellStyle();
                        titleCell.CellStyle.SetFont(font);

                        sheet.AutoSizeColumn(column.Ordinal);
                    }

                    rowIndex++;
                }



                string strParentDirectory = GetParentDirectory();
                strParentDirectory = strParentDirectory + "\\Data";
                if (!Directory.Exists(strParentDirectory))
                {
                    Directory.CreateDirectory(strParentDirectory );
                }
                string strFileName = strParentDirectory + "\\DailyFinishedJobHistory_" + DateTime.Now.ToString("yyyyMMdd")+".xls";
                if (File.Exists(strFileName))
                {
                    File.Delete(strFileName);
                }
                FileStream file = new FileStream(strFileName, FileMode.Create);
                workbook.Write(file);

                file.Close();
                headerRow = null;
                sheet = null;
                workbook = null;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
            }
            finally
            {
                dt.Dispose();
            }
        }
    }

现在我的excel数据看起来像 在此处输入图像描述

但我需要生成这种 excel 文件,其中数据和图表都将在同一张表中。这是屏幕截图。

在此处输入图像描述

4

2 回答 2

0

我认为下面的代码可以帮助您解决问题。

 private void btnRun_Click(object sender, System.EventArgs e)
        {
            Workbook workbook = new Workbook();

            //Initailize worksheet
            workbook.CreateEmptySheets(1);
            Worksheet sheet = workbook.Worksheets[0];
            sheet.Name = "Chart data";
            sheet.GridLinesVisible = false;

            //Writes chart data
            CreateChartData(sheet);
            //Add a new  chart worsheet to workbook
            Chart chart = sheet.Charts.Add();
            if (checkBox1.Checked)
            {
                chart.ChartType = ExcelChartType.Line3D;
            }
            else
            {
                chart.ChartType = ExcelChartType.Line;
            }

            //Set region of chart data
            chart.DataRange = sheet.Range["A1:E5"];

            //Set position of chart
            chart.LeftColumn = 1;
            chart.TopRow = 6;
            chart.RightColumn = 11;
            chart.BottomRow = 29;


            //Chart title
            chart.ChartTitle = "Sales market by country";
            chart.ChartTitleArea.IsBold = true;
            chart.ChartTitleArea.Size = 12;

            chart.PrimaryCategoryAxis.Title = "Month";
            chart.PrimaryCategoryAxis.Font.IsBold = true;
            chart.PrimaryCategoryAxis.TitleArea.IsBold = true;

            chart.PrimaryValueAxis.Title = "Sales(in Dollars)";
            chart.PrimaryValueAxis.HasMajorGridLines = false;
            chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90;
            chart.PrimaryValueAxis.MinValue = 1000;
            chart.PrimaryValueAxis.TitleArea.IsBold = true;

            foreach (Charts.ChartSerie cs in chart.Series)
            {
                cs.Format.Options.IsVaryColor = true;
                cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = true;

                if (!checkBox1.Checked)
                    cs.DataFormat.MarkerStyle = ChartMarkerType.Circle;
            }

            chart.PlotArea.Fill.Visible = false;

            chart.Legend.Position = LegendPositionType.Top;
            workbook.SaveToFile("Sample.xls");
            ExcelDocViewer(workbook.FileName);
        }

        private void CreateChartData(Worksheet sheet)
        {
            //Country
            sheet.Range["A1"].Value = "Country";
            sheet.Range["A2"].Value = "Cuba";
            sheet.Range["A3"].Value = "Mexico";
            sheet.Range["A4"].Value = "France";
            sheet.Range["A5"].Value = "German";

            //Jun
            sheet.Range["B1"].Value = "Jun";
            sheet.Range["B2"].NumberValue = 3300;
            sheet.Range["B3"].NumberValue = 2300;
            sheet.Range["B4"].NumberValue = 4500;
            sheet.Range["B5"].NumberValue = 6700;

            //Jul
            sheet.Range["C1"].Value = "Jul";
            sheet.Range["C2"].NumberValue = 7500;
            sheet.Range["C3"].NumberValue = 2900;
            sheet.Range["C4"].NumberValue = 2300;
            sheet.Range["C5"].NumberValue = 4200;

            //Aug
            sheet.Range["D1"].Value = "Aug";
            sheet.Range["D2"].NumberValue = 7700;
            sheet.Range["D3"].NumberValue = 6900;
            sheet.Range["D4"].NumberValue = 8400;
            sheet.Range["D5"].NumberValue = 4200;

            //Sep
            sheet.Range["E1"].Value = "Sep";
            sheet.Range["E2"].NumberValue = 8000;
            sheet.Range["E3"].NumberValue = 7200;
            sheet.Range["E4"].NumberValue = 8100;
            sheet.Range["E5"].NumberValue = 5600;

            //Style
            sheet.Range["A1:E1"].Style.Font.IsBold = true;
            sheet.Range["A2:E2"].Style.KnownColor = ExcelColors.LightYellow;
            sheet.Range["A3:E3"].Style.KnownColor = ExcelColors.LightGreen1;
            sheet.Range["A4:E4"].Style.KnownColor = ExcelColors.LightOrange;
            sheet.Range["A5:E5"].Style.KnownColor = ExcelColors.LightTurquoise;

            //Border
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeTop].Color = Color.FromArgb(0, 0, 128);
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeBottom].Color = Color.FromArgb(0, 0, 128);
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeLeft].Color = Color.FromArgb(0, 0, 128);
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeRight].Color = Color.FromArgb(0, 0, 128);
            sheet.Range["A1:E5"].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;

            sheet.Range["B2:D5"].Style.NumberFormat = "\"$\"#,##0";
        }

在使用上述代码之前,您需要添加 Spire.Xls 库。

于 2014-06-06T08:11:26.133 回答
0

NPOI 2.1 将支持 LineChart。将于2014年6月发布

于 2014-05-21T04:53:04.543 回答