Пример #1
0
 //设置是否进入本页小计标识
 private void setInPageRow(DataTable dt, DataRow row, BodyDataStruct dataStruct)
 {
     if (dt.Columns.Contains("inpagerow") && row["inpagerow"].ToString().ToLower() == "no")
     {
         dataStruct.IsFunCell = false;
     }
 }
Пример #2
0
        //无数据情况加入显示报表设计中的样式
        private void ShowDesignStyle(Report report)
        {
            //依次读取表体的行,填入到数据区中
            for (int i = 1; i <= report.Bands[3]; i++)
            {
                DataRow row             = bodyData.NewRow();
                int     notVisibleCount = 0;
                string  xxxFlag         = "0";
                foreach (Text text in bodyTexts.BodyTexts.GetTextsBy(3, i))
                {
                    if (text.Location.X2 != report.Columns.Count + 1)
                    {
                        string columnName = report.Columns[text.Location.X1 - 1].ColumnName;
                        if (listNoPrintColumn.Contains(columnName) || listNoDataPrintColumn.Contains(columnName))
                        {
                            notVisibleCount++;
                            continue;
                        }
                        BodyDataStruct dataStruct = new BodyDataStruct();
                        //合并信息
                        int noPrintCount     = 0;
                        int noDataPrintCount = 0;

                        if (text.ColumnSpan > 1)
                        {
                            int columnSpan = text.ColumnSpan;
                            noPrintCount     = GetNotDisplayColumnCount(report, columnName, columnSpan, listNoPrintColumn);
                            noDataPrintCount = GetNotDisplayColumnCount(report, columnName, columnSpan, listNoDataPrintColumn);
                        }
                        dataStruct.ColMergeInfo.MergeCount = text.ColumnSpan - noPrintCount - noDataPrintCount;

                        dataStruct.RowMergeInfo.RowMergeCount = text.RowSpan;

                        dataStruct.Context = text.Context;
                        //对齐方式

                        dataStruct.ColMergeInfo.LineAlignment = text.Attribute.Valign.LineAlignment;
                        dataStruct.ColMergeInfo.Alignment     = text.Attribute.Valign.Alignment;

                        //边框信息
                        dataStruct.RowMergeInfo.BoundaryLine = text.Attribute.BoundaryLine.Clone();
                        //字体
                        dataStruct.ColMergeInfo.Font = text.Attribute.Font;
                        row[columnName] = dataStruct;
                    }
                    else
                    {
                        xxxFlag = text.Context;
                    }
                }
                row[ConstantKey.XXXFLAG] = xxxFlag;


                bodyData.Rows.Add(row);
            }
            DataRow newRow = bodyData.NewRow();

            newRow[ConstantKey.XXXFLAG] = ConstantKey.PAGINGFLAGVAL;
            bodyData.Rows.Add(newRow);
        }
Пример #3
0
        //合并空白行信息
        public void MergeBlack(Report report, Dictionary <string, int> dicMergeColInfo)
        {
            foreach (KeyValuePair <string, int> pair in dicMergeColInfo)
            {
                string[]       point      = pair.Key.Split(',');
                int            rowIndex   = Convert.ToInt32(point[0]);
                int            colIndex   = Convert.ToInt32(point[1]) - 1;
                BodyDataStruct dataStruct = report.Data.BodyData.Rows[rowIndex][colIndex] as BodyDataStruct;
                if (dataStruct != null)
                {
                    dataStruct.RowMergeInfo.RowMergeCount = pair.Value + 1;
                    for (int i = rowIndex + 1; i < rowIndex + pair.Value + 1; i++)
                    {
                        BodyDataStruct bStruct = report.Data.BodyData.Rows[i][colIndex] as BodyDataStruct;
                        bStruct.Tag = "mergeCol";
                        if (bStruct != null)
                        {
                            bStruct.RowMergeInfo.BoundaryLine.UpperBoundaryLine = false;
                        }
                    }
                }
            }

            for (int i = 0; i < report.Data.BodyData.Rows.Count; i++)
            {
                int colMerge = 1;
                for (int j = report.Data.BodyData.Columns.Count - 1; j >= 0; j--)
                {
                    BodyDataStruct dataStruct = bodyData.Rows[i][j] as BodyDataStruct;
                    if (report.Data.BodyData.Columns[j].ColumnName != "xxx_flag")
                    {
                        if (dataStruct == null)
                        {
                            colMerge++;
                        }
                        else if (dataStruct.Context.Trim() == "" && dataStruct.Tag.ToString() == "")
                        {
                            //去掉空白行的左右边框线
                            dataStruct.RowMergeInfo.BoundaryLine.LeftBoundaryLine = false;
                            if (j != bodyData.Columns.Count - 2)
                            {
                                dataStruct.RowMergeInfo.BoundaryLine.RightBooundaryLine = false;
                            }
                            colMerge++;
                        }
                        else
                        {
                            dataStruct.ColMergeInfo.MergeCount = colMerge;
                            //合并空行右边框显示问题
                            if (j + colMerge - 1 != bodyData.Columns.Count - 2)
                            {
                                dataStruct.RowMergeInfo.BoundaryLine.RightBooundaryLine = false;
                            }
                            colMerge = 1;
                        }
                    }
                }
            }
        }
Пример #4
0
        private void FillNewData(DataTable dt, Report currReport)
        {
            int pageNum        = 1;
            int titleBandCount = 0;
            //将datatable根据-1,-2进行拆分
            List <DataTable> listDt = SplitTable(dt);

            foreach (DataTable dataTable in listDt)
            {
                //整张表无数据,并且不是第一张表,忽略掉此表
                if (dataTable.Select("rowGroup>=0").Length == 0 && pageNum > 1)
                {
                    continue;
                }
                foreach (DataRow row in dataTable.Rows)
                {
                    DataRow newRow = bodyData.NewRow();
                    //-1分页符 -2分隔符 -3宏变量  (-20,-5)共享列中的表头
                    int rowGroup = Convert.ToInt32(row["rowGroup"]);
                    if (rowGroup == -1)
                    {
                        pageNum++;
                        newRow[ConstantKey.XXXFLAG] = -1;
                        bodyData.Rows.Add(newRow);
                    }
                    else if (rowGroup == -2)
                    {
                    }
                    else if (rowGroup == -3)
                    {
                        macorsVerbCollection.Add(pageNum, row["macroName"].ToString(), row["macroValue"].ToString());
                    }
                    else if (rowGroup >= -20 && rowGroup <= -5)
                    {
                        int count             = 0;
                        int dynmicColumnCount = 0;

                        for (int i = 0; i < bodyData.Columns.Count - 1; i++)
                        {
                            string       colName        = bodyData.Columns[i].ColumnName;
                            ReportColumn column         = currReport.Columns.Find(colName);
                            bool         isDynmicColumn = column.Attibutes.DynamicColumn;

                            string[] strs = colName.Split('_');
                            if (bodyTexts.HasText(Convert.ToInt32(row["rowGroup"]), colName) || isDynmicColumn)
                            {
                                Text text = bodyTexts[Convert.ToInt32(row["rowGroup"]), isDynmicColumn ? strs[0] : colName];
                                if (text == null)
                                {
                                    if (isDynmicColumn)
                                    {
                                        count++;
                                    }
                                    continue;
                                }
                                Text newText = new Text();
                                newText.Attribute = text.Attribute;
                                Location location = new Location();
                                location.Y1 = text.Location.Y1;
                                location.Y2 = text.Location.Y2;

                                /*
                                 * 单元格位置信息
                                 * 数据中共享列的位置 = rpt中的位置 + 共享列个数
                                 * 共享列之钱普通数据位置 = rpt中的位置
                                 * 共享列之后的普通数据 = rpt中的位置 + 共享列个数 - 1(去掉原始的占列位置)
                                 */

                                if (isDynmicColumn)
                                {
                                    int notVisibleColCount       = dynmicColumnInfo.GetNotVistbleCount(dynmicColumnInfo.DynmicColumns, strs[0], text.ColumnSpan);
                                    int beforeNotVisibleColCount = dynmicColumnInfo.GetBeforeNotVisibleCount(dynmicColumnInfo.DynmicColumns, strs[0]);
                                    int xs = count / dynmicColumnInfo.DynmicColumns.VisibleColumnCount;
                                    location.X1        = text.Location.X1 + xs * dynmicColumnInfo.DynmicColumns.VisibleColumnCount - beforeNotVisibleColCount;
                                    location.X2        = text.Location.X2 + xs * dynmicColumnInfo.DynmicColumns.VisibleColumnCount - notVisibleColCount - beforeNotVisibleColCount;
                                    count             += text.ColumnSpan - notVisibleColCount;
                                    dynmicColumnCount += text.ColumnSpan - notVisibleColCount;
                                }
                                else
                                {
                                    ////共享列的个数,有共享列的情况下,需要去掉原始共享列暂用位置
                                    //int tempDynmicColCount = dynmicColumnCount;
                                    //if (dynmicColumnCount > 0)
                                    //    tempDynmicColCount = dynmicColumnCount - dynmicColumnInfo.DynmicColumns.Count;
                                    location.X1 = text.Location.X1 + dynmicColumnCount;
                                    location.X2 = text.Location.X2 + dynmicColumnCount;
                                }

                                if (text.ColumnSpan > dynmicColumnInfo.DynmicColumns.Count)
                                {
                                    int           colSpan = 0;
                                    List <string> list    = new List <string>();
                                    //判断合并列中是否包含了共享列,包含的话从新计算columnSpan
                                    int index     = currReport.Columns.IndexOf(colName);
                                    int spanCount = GetSpanCount(report, index, text.ColumnSpan);

                                    for (int k = index; k < index + spanCount; k++)
                                    {
                                        if (currReport.Columns[k].Attibutes.DynamicColumn)
                                        {
                                            string dynmicName = currReport.Columns[k].ColumnName.Split('_')[0];
                                            if (!list.Contains(dynmicName))
                                            {
                                                list.Add(dynmicName);
                                                foreach (ReportColumn col in currReport.Columns)
                                                {
                                                    if (dynmicName == col.ColumnName.Split('_')[0])
                                                    {
                                                        colSpan += 1;
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            colSpan += 1;
                                        }
                                    }
                                    int oldX2 = location.X2;
                                    location.X2 = location.X1 + colSpan - 1;
                                    int noPrintColumnCount = GetNotDisplayColumnCount(report, colName, text.ColumnSpan, listNoPrintColumn);
                                    dynmicColumnCount = location.X2 - oldX2 + noPrintColumnCount;
                                }

                                newText.Location = location;
                                string context = string.Empty;
                                if (dataTable.Columns.Contains(colName))
                                {
                                    context = row[colName].ToString();
                                }
                                newText.Context   = context;
                                newText.BandIndex = 2;
                                currReport.Texts.Add(newText);
                                i += newText.ColumnSpan - 1;
                                currReport.Bands.SetBindRowNum(2, 1);
                            }
                        }
                        titleBandCount++;
                        currReport.Bands.SetBindRowNum(2, titleBandCount);
                    }
                    else
                    {
                        int  xxx_flag      = 0;
                        bool validRowGroup = false;
                        for (int i = 0; i < bodyData.Columns.Count - 1; i++)
                        {
                            xxx_flag++;
                            string colName = bodyData.Columns[i].ColumnName;

                            bool isDynmicColumn = false;
                            if (dynamicReport != null)
                            {
                                ReportColumn column = dynamicReport.Columns.Find(colName);
                                if (column != null)
                                {
                                    isDynmicColumn = column.Attibutes.DynamicColumn;
                                }
                            }
                            string[] strs = colName.Split('_');
                            Text     text = null;

                            if (isDynmicColumn)
                            {
                                text = bodyTexts[rowGroup, strs[0]];
                            }
                            else
                            {
                                if (bodyTexts.HasText(rowGroup, colName))
                                {
                                    text = bodyTexts[rowGroup, colName];
                                }
                                else
                                {
                                    text = GetPreText(rowGroup, colName);
                                }
                            }


                            if (text == null)
                            {
                                continue;
                            }


                            validRowGroup = true;
                            BodyDataStruct dataStruct = new BodyDataStruct();
                            //设置是否进入本页小计
                            setInPageRow(dataTable, row, dataStruct);

                            if (dataTable.Columns.Contains(colName))
                            {
                                dataStruct.Context = string.IsNullOrEmpty(text.CellText) ? row[colName].ToString() : text.CellText;
                            }
                            else
                            {
                                dataStruct.Context = text.CellText;
                            }

                            //有列合并的,查看是否存在固定不打印的列
                            int noPrintCount     = 0;
                            int noDataPrintCount = 0;

                            if (text.ColumnSpan > 1)
                            {
                                int columnSpan = text.ColumnSpan;
                                noPrintCount     = GetNotDisplayColumnCount(currReport, colName, columnSpan, listNoPrintColumn);
                                noDataPrintCount = GetNotDisplayColumnCount(currReport, colName, columnSpan, listNoDataPrintColumn);
                            }

                            //合并信息
                            dataStruct.ColMergeInfo.MergeCount = text.ColumnSpan - noPrintCount - noDataPrintCount;
                            if (text.RowSpan > 1)
                            {
                                List <string> listRowGroup = new List <string>();

                                //有行合并的,查看数据中包含多少个合并行
                                for (int j = text.Location.Y1; j < text.Location.Y1 + text.RowSpan; j++)
                                {
                                    foreach (Text bodyText in bodyTexts.BodyTexts)
                                    {
                                        if (
                                            bodyText.Location.Y1 == j &&
                                            bodyText.Location.Y2 == j &&
                                            bodyText.Location.X1 == report.Columns.Count + 1 &&
                                            bodyText.Location.X2 == report.Columns.Count + 1
                                            )
                                        {
                                            listRowGroup.Add(bodyText.Context);
                                        }
                                    }
                                }
                                DataRow[] rows = dataTable.Select(String.Format("RowGroup in ({0})", string.Join(",", listRowGroup.ToArray())));
                                dataStruct.RowMergeInfo.RowMergeCount = rows.Length;
                            }
                            else
                            {
                                dataStruct.RowMergeInfo.RowMergeCount = text.RowSpan;
                            }
                            //对齐方式

                            dataStruct.ColMergeInfo.LineAlignment = text.Attribute.Valign.LineAlignment;
                            dataStruct.ColMergeInfo.Alignment     = text.Attribute.Valign.Alignment;

                            //边框信息
                            dataStruct.RowMergeInfo.BoundaryLine = text.Attribute.BoundaryLine.Clone();
                            //特殊线
                            switch (text.Attribute.Diagonal)
                            {
                            case 1:
                                dataStruct.RowMergeInfo.BoundaryLine.IsSlash = true;
                                break;

                            case 2:
                                dataStruct.RowMergeInfo.BoundaryLine.IsBackSlash = true;
                                break;

                            case 3:
                                dataStruct.RowMergeInfo.BoundaryLine.IsCrossLine = true;
                                break;

                            default:
                                dataStruct.RowMergeInfo.BoundaryLine.IsSlash     = false;
                                dataStruct.RowMergeInfo.BoundaryLine.IsBackSlash = false;
                                dataStruct.RowMergeInfo.BoundaryLine.IsCrossLine = false;
                                break;
                            }
                            //字体
                            dataStruct.ColMergeInfo.Font = text.Attribute.Font;

                            newRow[colName] = dataStruct;
                            i += text.ColumnSpan - 1 - noPrintCount - noDataPrintCount;
                        }
                        if (validRowGroup)
                        {
                            newRow[ConstantKey.XXXFLAG] = rowGroup > 1000 ? rowGroup : xxx_flag;
                            bodyData.Rows.Add(newRow);
                        }
                    }
                }
            }
        }
Пример #5
0
        private void FillOldData(DataTable dt, Report currReport)
        {
            int pageNum = 1;

            foreach (DataRow row in dt.Rows)
            {
                if (string.IsNullOrEmpty(row[ConstantKey.XXXFLAG].ToString()))
                {
                    row[ConstantKey.XXXFLAG] = 0;
                }
                DataRow newRow = bodyData.NewRow();
                switch (row[ConstantKey.XXXFLAG].ToString())
                {
                case "-1":
                    pageNum++;
                    newRow[ConstantKey.XXXFLAG] = -1;
                    bodyData.Rows.Add(newRow);
                    break;

                case "-3":
                    string[] macros     = System.Text.RegularExpressions.Regex.Split(row["xxx_expand1"].ToString(), @"\(@@\)");
                    string   macroName  = macros[0];
                    string   macroValue = macros[1];
                    macorsVerbCollection.Add(pageNum, macroName, macroValue);
                    break;

                case "0":
                    foreach (DataColumn column in dt.Columns)
                    {
                        if (bodyData.Columns.Contains(column.ColumnName))
                        {
                            BodyDataStruct dataStruct = new BodyDataStruct();
                            dataStruct.Context = row[column].ToString();
                            //设置是否进入本页小计
                            setInPageRow(dt, row, dataStruct);

                            newRow[column.ColumnName] = dataStruct;
                        }
                    }
                    bodyData.Rows.Add(newRow);
                    break;

                default:
                    foreach (DataColumn column in dt.Columns)
                    {
                        if (column.ColumnName.StartsWith("xxx_expand") && !column.ColumnName.EndsWith("sx_ex"))
                        {
                            string value = row[column].ToString();
                            if (!string.IsNullOrEmpty(value))
                            {
                                string[]       propertys  = System.Text.RegularExpressions.Regex.Split(value, @"\(@@\)");
                                BodyDataStruct dataStruct = new BodyDataStruct();
                                //设置是否进入本页小计
                                setInPageRow(dt, row, dataStruct);

                                int startColumnIndex = int.Parse(propertys[0]);
                                int endColumnIndex   = int.Parse(propertys[1]);
                                //有列合并的,查看是否存在固定不打印的列
                                int noPrintCount     = 0;
                                int noDataPrintCount = 0;
                                int columnSpan       = endColumnIndex - startColumnIndex + 1;
                                if (columnSpan > 1)
                                {
                                    noPrintCount     = GetNotDisplayColumnCount(currReport, startColumnIndex, endColumnIndex, listNoPrintColumn);
                                    noDataPrintCount = GetNotDisplayColumnCount(currReport, startColumnIndex, endColumnIndex, listNoDataPrintColumn);
                                }

                                //合并信息
                                dataStruct.ColMergeInfo.MergeCount = columnSpan - noPrintCount - noDataPrintCount;
                                dataStruct.Context = propertys[2];
                                if (propertys[3].ToString() == "0")
                                {
                                    dataStruct.ColMergeInfo.LineAlignment = System.Drawing.StringAlignment.Near;
                                }
                                else if (propertys[3].ToString() == "1")
                                {
                                    dataStruct.ColMergeInfo.LineAlignment = System.Drawing.StringAlignment.Far;
                                }
                                else
                                {
                                    dataStruct.ColMergeInfo.LineAlignment = System.Drawing.StringAlignment.Center;
                                }

                                if (propertys[4].ToString() == "700")
                                {
                                    dataStruct.ColMergeInfo.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Bold);
                                }

                                string sxColumn = column.ColumnName + "_sx_ex";
                                if (dt.Columns.Contains(sxColumn))
                                {
                                    string sxValue = row[sxColumn].ToString();
                                    if (!string.IsNullOrEmpty(sxValue))
                                    {
                                        string[] merge = sxValue.Split(',');
                                        if (merge.Length >= 5)
                                        {
                                            dataStruct.RowMergeInfo.RowMergeCount = int.Parse(merge[0]);
                                            dataStruct.RowMergeInfo.BoundaryLine.UpperBoundaryLine  = merge[1] == "1";
                                            dataStruct.RowMergeInfo.BoundaryLine.LowerBoundaryLine  = merge[2] == "1";
                                            dataStruct.RowMergeInfo.BoundaryLine.LeftBoundaryLine   = merge[3] == "1";
                                            dataStruct.RowMergeInfo.BoundaryLine.RightBooundaryLine = merge[4] == "1";
                                        }
                                    }
                                }

                                for (int i = startColumnIndex - 1; i < endColumnIndex; i++)
                                {
                                    if (report.Columns.Count > i)
                                    {
                                        string colName = report.Columns[i].ColumnName;
                                        if (bodyData.Columns.Contains(colName))
                                        {
                                            newRow[colName] = dataStruct;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    newRow[ConstantKey.XXXFLAG] = row[ConstantKey.XXXFLAG];
                    bodyData.Rows.Add(newRow);
                    break;
                }
            }
        }