在C#中根据Excel文件画FastReport .NET报表模板
来源:互联网 发布:电子商务网络平台创业 编辑:程序博客网 时间:2024/04/30 12:28
用NPOI改写了读取EXCEL的部分,然后加入到FP的源码( http://www.commuch.com )中去以插件的形式存在。如图
public void LoadReport(string fileName) { WorkBook book = new WorkBook(fileName); List<string> sheetNames = new List<string>(); for (int i = 0; i < book.SheetCount; i++) { sheetNames.Add(book[i].Name); } string LeadOutPath = string.Empty; List<string> SelectedNames = new List<string>(); using (FormSheetSelect frm = new FormSheetSelect().Start(sheetNames)) { if (frm.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) return ; LeadOutPath = frm.LeadOutPath; SelectedNames.AddRange(frm.SelectedItems); } for (int i = 0; i < book.SheetCount; i++) { if (!SelectedNames.Contains(book[i].Name)) continue; IWorkSheet sheet = book[i]; if (sheet.RowCount < 1) continue; System.IO.StringWriter mem = new System.IO.StringWriter(); System.Xml.XmlTextWriter sw = new System.Xml.XmlTextWriter(mem); sw.Formatting = System.Xml.Formatting.Indented; sw.WriteStartElement("ReportPage"); sw.WriteAttributeString("Name", "Page1"); #region 处理纸张 System.Drawing.Size paperSize = new System.Drawing.Size(); sw.WriteAttributeString("RawPaperSize", sheet.PageSettings.PaperSize.RawKind.ToString()); paperSize = new System.Drawing.Size(Inch2Pix(sheet.PageSettings.PaperSize.Width / 100, true), Inch2Pix(sheet.PageSettings.PaperSize.Height / 100, false)); if (sheet.PageSettings.Landscape) { sw.WriteAttributeString("Landscape", "true"); sw.WriteAttributeString("PaperWidth", GetPaperSize(sheet.PageSettings.PaperSize).Height.ToString()); sw.WriteAttributeString("PaperHeight", GetPaperSize(sheet.PageSettings.PaperSize).Width.ToString()); } else { sw.WriteAttributeString("PaperWidth", GetPaperSize(sheet.PageSettings.PaperSize).Width.ToString()); sw.WriteAttributeString("PaperHeight", GetPaperSize(sheet.PageSettings.PaperSize).Height.ToString()); } //bound sw.WriteAttributeString("LeftMargin", Inch2mm(sheet.PageSettings.Margins.Left / 100d).ToString()); sw.WriteAttributeString("TopMargin", Inch2mm(sheet.PageSettings.Margins.Top / 100d).ToString()); sw.WriteAttributeString("RightMargin", Inch2mm(sheet.PageSettings.Margins.Right / 100d).ToString()); sw.WriteAttributeString("BottomMargin", Inch2mm(sheet.PageSettings.Margins.Bottom / 100d).ToString()); #endregion #region 写标题 sw.WriteStartElement("ReportTitleBand"); sw.WriteAttributeString("Name", "ReportTitle1"); if (sheet.PageSettings.Landscape) { sw.WriteAttributeString("Height", (paperSize.Width - (sheet.PageSettings.Margins.Left + sheet.PageSettings.Margins.Right)).ToString()); sw.WriteAttributeString("Width", (paperSize.Height - (sheet.PageSettings.Margins.Top + sheet.PageSettings.Margins.Bottom)).ToString()); } else { sw.WriteAttributeString("Width", (paperSize.Width - (sheet.PageSettings.Margins.Left + sheet.PageSettings.Margins.Right)).ToString()); sw.WriteAttributeString("Height", (paperSize.Height - (sheet.PageSettings.Margins.Top + sheet.PageSettings.Margins.Bottom)).ToString()); } sw.WriteStartElement("TableObject"); sw.WriteAttributeString("Name", "Table2"); if (sheet.PageSettings.Landscape) { sw.WriteAttributeString("Height", (paperSize.Width - (sheet.PageSettings.Margins.Left + sheet.PageSettings.Margins.Right)).ToString()); sw.WriteAttributeString("Width", (paperSize.Height - (sheet.PageSettings.Margins.Top + sheet.PageSettings.Margins.Bottom)).ToString()); } else { sw.WriteAttributeString("Width", (paperSize.Width - (sheet.PageSettings.Margins.Left + sheet.PageSettings.Margins.Right)).ToString()); sw.WriteAttributeString("Height", (paperSize.Height - (sheet.PageSettings.Margins.Top + sheet.PageSettings.Margins.Bottom)).ToString()); } //sw.WriteAttributeString("ManualBuildEvent", "Table2_ManualBuild"); sw.WriteAttributeString("AfterDataEvent", "Table2_AfterData"); #endregion double pi = 1; try { //指定了缩放条件则缩放 pi = (int)sheet.Scale / 100d; } catch { pi = 1; } //认为表单是规则的二维表 IRow firstRow = sheet.FirstRow; int cellCount = firstRow.CellCount;//强制以标题占用的单元格数目为准 if (firstRow.FirstCell != null) { System.Drawing.Point firtCellPoint = firstRow.FirstCell.MergeCellsCount; if (firtCellPoint.Y > 0) { cellCount = firtCellPoint.Y; } } for (int c = firstRow.FirstCellIndex; c < cellCount + firstRow.FirstCellIndex; c++) { sw.WriteStartElement("TableColumn"); sw.WriteAttributeString("Name", "Column" + c.ToString()); sw.WriteAttributeString("Width", (pi * sheet.GetColumnWidth(c)).ToString()); sw.WriteEndElement(); } for (int r = sheet.FirstRowIndex; r < sheet.RowCount + sheet.FirstRowIndex; r++) { firstRow = sheet.Rows(r); if (firstRow == null) continue; sw.WriteStartElement("TableRow"); sw.WriteAttributeString("Name", "Row" + r.ToString()); sw.WriteAttributeString("Height", Point2Pix(pi * firstRow.Height).ToString()); for (int c = sheet.Rows(r).FirstCellIndex; c <= cellCount + firstRow.FirstCellIndex; c++) { ICell cell = firstRow[c]; if (cell == null) continue; sw.WriteStartElement("TableCell"); sw.WriteAttributeString("Name", "Cell" + (c * 1000 + r).ToString()); if (cell.Text != null) { sw.WriteStartAttribute("Text"); double d; if (double.TryParse(cell.Text.ToString(), out d) && d == 0) { sw.WriteValue(""); } else sw.WriteValue(cell.Text); sw.WriteEndAttribute(); } if (cell.TextOrientation) sw.WriteAttributeString("TextOrientation", "True"); sw.WriteAttributeString("HideZeros", "true"); sw.WriteStartAttribute("HorzAlign"); sw.WriteValue(cell.HorizontalAlignment.ToString()); sw.WriteEndAttribute(); sw.WriteAttributeString("VertAlign", cell.VerticalAlignment.ToString()); sw.WriteAttributeString("Font", cell.Font(pi)); System.Drawing.Point MergeCellsCount = cell.MergeCellsCount; if (MergeCellsCount.Y > 1) sw.WriteAttributeString("ColSpan", MergeCellsCount.Y.ToString()); if (MergeCellsCount.X > 1) sw.WriteAttributeString("RowSpan", MergeCellsCount.X.ToString()); Type dataType = cell.DataType; if (dataType.Equals(typeof(double))) { sw.WriteAttributeString("Format", "Number"); sw.WriteAttributeString("Format.UseLocale", "false"); sw.WriteAttributeString("Format.DecimalDigits", "2"); sw.WriteAttributeString("Format.DecimalSeparator", "."); sw.WriteAttributeString("Format.GroupSeparator", ""); sw.WriteAttributeString("Format.NegativePattern", "1"); } else if (dataType.Equals(typeof(int))) { sw.WriteAttributeString("Format", "Number"); sw.WriteAttributeString("Format.UseLocale", "false"); sw.WriteAttributeString("Format.DecimalDigits", "0"); sw.WriteAttributeString("Format.DecimalSeparator", "."); sw.WriteAttributeString("Format.GroupSeparator", ""); sw.WriteAttributeString("Format.NegativePattern", "1"); break; } string line = string.Format("{0}{1}{2}{3}", cell.HasBorder(0) ? ",Left" : "", (MergeCellsCount.Y > 1) ? (firstRow[c + MergeCellsCount.Y - 1].HasBorder(1) ? ",Right" : "") : (cell.HasBorder(1) ? ",Right" : ""), cell.HasBorder(2) ? ",Top" : "", (MergeCellsCount.X > 1) ? (sheet[r + MergeCellsCount.X - 1, c].HasBorder(3) ? ",Bottom" : "") : (cell.HasBorder(3) ? ",Bottom" : "") ); if (line.Length > 0) sw.WriteAttributeString("Border.Lines", line.Substring(1)); sw.WriteEndElement(); } sw.WriteEndElement(); } sw.WriteEndElement(); sw.WriteEndElement(); sw.WriteEndElement(); mem.Flush(); if (string.IsNullOrEmpty(LeadOutPath)) { Report.Load( new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes( template.Replace("$#report#{1}quot;, mem.ToString().Replace("", ""))))); } else { if (!System.IO.Directory.Exists(System.IO.Path.Combine(LeadOutPath,System.IO.Path.GetFileNameWithoutExtension( book.FullName)))) System.IO.Directory.CreateDirectory(System.IO.Path.Combine(LeadOutPath, System.IO.Path.GetFileNameWithoutExtension(book.FullName))); System.IO.File.WriteAllText( System.IO.Path.Combine(LeadOutPath, System.IO.Path.GetFileNameWithoutExtension(book.FullName) + "\\" + sheet.Name + ".frx"), template.Replace("$#report#{1}quot;, mem.ToString().Replace("", "")), System.Text.Encoding.UTF8); } sw.Close(); mem.Close(); if (string.IsNullOrEmpty(LeadOutPath)) break;//非导出模式只处理第一个表单 } book.Close(); if (!string.IsNullOrEmpty(LeadOutPath)) { System.Windows.Forms.MessageBox.Show("ok"); } }
转换的报表几乎与原表一样,总算不再需要FP来画表了,画表永远 是EXCEL最爽。
以下为EXCEL中的效果
- 在C#中根据Excel文件画FastReport .NET报表模板
- FastReport.Net报表中使用 Excel 文件作为数据源
- .Net报表控件FastReport.Net在C#程序中如何邦定报表模版
- FastReport.net在用户的应用程序中创建报表
- FastReport.net在用户的应用程序中创建报表
- 使用FastReport.net在用户的应用程序中创建报表
- 使用报表工具FastReport.NET在XAML中创建表格
- 在数据库中保存FastReport .Net报表
- asp.net中利用XML描述文件和Excel模板相结合的方法生成Excel报表
- C#学习博客-FastReport在.Net中使用
- 在C#中利用Excel做报表
- c# FastReport开发报表
- c# FastReport开发报表
- FastReport.Net C#程序邦定报表模版
- FastReport.Net C#程序邦定报表模版
- .net 根据模板导入excel
- fastreport.net 调用模板
- 在asp.net中使用excel模板
- kinect 十分有趣的体验
- 让背景小图不是拉伸而是多个重复
- javascript关于event的ie ff兼容性问题
- C++0x : Inefficient way to perform trivial named args and default args at the same time
- PipeStyle PHP链式风格
- 在C#中根据Excel文件画FastReport .NET报表模板
- 截断双击标题栏事件
- js遍历GridView中的每一个文本控件
- 简单验证软件版本和限定日期,通过网络上的XML
- c/c++ memset用法
- 解决android自定义标题栏充满的问题
- Eclipse中控制Android模拟器行为
- android监听文件和目录的创建删除移动等事件
- Android源码make常见错误