c#根据表格导出报表_如何将表格或报表导出为“包”

c#根据表格导出报表

它通常在Access开发环境中发生:您正在一个数据库中工作,并且意识到要在您或您的公司也在开发的另一个数据库中使用表单或报表。 但是,当您导入/导出对象时,您会发现它依赖的许多对象(表,查询,子表单/子报表)不在另一个数据库中,并且也需要导入/导出。 最终,您将一切转移了,但是想知道这是否真的值得所有麻烦。

答案是:“不,不是。” 那不是用VBA可以完成的全部工作! 通过访问对象的Dependencies集合,我们可以查找和导出表单或报表需要运行的每个对象。

依赖关系保存在数据库系统表中,而不保存在对象定义本身中,因此必须使用[object] .GetDependencies将它们填充到自己的对象中。 从那里开始,只需遍历所有依赖项即可。

以下三个代码过程完成了将每个依赖关系对象导出到专门创建的数据库的工作。 然后,您可以将软件包发送给另一位开发人员,或者将其批量复制到另一个工作数据库中。 将代码粘贴到新模块中以使用它。

第一个过程创建导出数据库,并将顶级对象传递给打包过程。 DepColl数组和DepI迭代器用于保存对所有转换对象的引用,以防止由于多个依赖项而转换相同对象。 在此过程中,我们还确保将“跟踪名称自动更正信息”设置为True(1),因为这将创建存储所有对象依赖项的系统表。


'PackageObjects Module
'Example: PackageObject([Object Name],"Form" or "Report")
'2014 Topher Ritchie
'This code is free for use in development and must
'retain this section.
'=========================================================
'Module Declarations section
'========================================================= 
Option Compare Database
Option Explicit 
Public DepColl() As String
Public DepI As Long  
Public Sub PackageObject(strObject As String, strType As String)
Dim db As Object 
    Application.SetOption "Track Name AutoCorrect Info", 1
    Access.DBEngine.CreateDatabase "F:\MyDatabases\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", DB_LANG_GENERAL 
    Set db = Application.CurrentProject
    If strType = "Form" Then
        OutputItem strObject, -32768
        PackageDependencies db.AllForms.Item(strObject)
    ElseIf strType = "Report" Then
        OutputItem strObject, -32764
        PackageDependencies db.AllReports.Item(strObject)
    End If
    ReDim DepColl(0)
    DepI = 0
End Sub 
下一个过程是模块的“肉”。 这将使用依赖项集合填充对象,然后遍历每个对象依赖项以确保尚未将其导出。 如果还没有,则代码将其导出,然后使用导出的对象递归调用自身,以获取主对象的所有n级依赖关系。 不幸的是,这是代码遇到麻烦的地方。 它可能会遇到无限循环,在该循环中它会继续调用自身,但是不会输出任何新对象。 幸运的是,如果您正在查看即时窗口,您将看到何时开始发生,因为那里没有新的对象出现。 这不是最佳解决方案,但是由于此代码仅用于开发目的,而不是用于生产系统,因此,只需在此时中断代码并停止它即可。

Public Sub PackageDependencies(objObject As Object)
    Dim DepObj As Object
    Dim DepObjColl As Object
    Dim i As Long
On Error GoTo Err_Exit: 
    Set DepObjColl = objObject.GetDependencyInfo
    For Each DepObj In DepObjColl.Dependencies
        For i = 1 To DepI
            If DepObj.name = DepColl(i) Then GoTo SkipObj
        Next i
        DepI = DepI + 1
        ReDim Preserve DepColl(DepI)
        DepColl(DepI) = DepObj.name
        OutputItem DepObj.name, DLookup("Type", "MSysObjects", "NAME = '" & DepObj.name & "'")
        PackageDependencies DepObj
SkipObj:
    Next DepObj 
Err_Exit:
End Sub 
最终代码过程将实际导出到保留数据库。 与原始过程调用类似,它传递了一个对象名称和类型,但是在这种情况下,该类型(不是纯文本)是使用上述DLookup语句从系统表中提取的整数值。 为了清楚起见,此最终过程只是将Type转换为acObjectType常量声明。

Public Sub OutputItem(strName As String, lngType As Long)
    Debug.Print strName, lngType
    If lngType = 1 Or lngType = 6 Then
        DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acTable, strName, strName
    ElseIf lngType = 5 Then
        DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acQuery, strName, strName
    ElseIf lngType = -32768 Then
        DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acForm, strName, strName
    ElseIf lngType = -32764 Then
        DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\MyDatabases\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acReport, strName, strName
    End If
End Sub 
使用此代码,您将能够输出完整的表单或报表,并且其所有依赖关系都完整无缺,可以使用。 通过在第一个过程中添加几行代码,如果您愿意,还可以使用它来传输查询,但这超出了我的原始范围。

翻译自: https://bytes.com/topic/access/insights/954635-how-export-form-report-package

c#根据表格导出报表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
含使用和开发接口文档,及Delphi、VB、VC++、C#.net、VB.net和WEB下的demo。 ACReport简介 Anycell Report(简称AC Report)是一款中国式报表组件,是国内最早的基于表格,支持图文混排、公式和脚本的中国式报表工具之一。就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须上下对齐,在制作复杂的中国式报表时可以避免很多不必要的合并拆分操作,制作表格更加方便和随心所欲,并且省时省力。AC Report单元格支持多种丰富的形态,例如格式化文本、图片、图表、条码、OLE容器等。 AC Report的一些基本特点: 1.独具特色的表格,风格与Word表格相似,但可以做出比Word或Excel更灵活的表格来。 2. 功能全面、专业的中国式报表设计器,中国用户更易于学习和接受。 3.支持多种单元格样式,可以打印图像、图表(直方图、折线图等)、Rich文本、 条形码、中式财务帐薄、支持在报表中嵌入Word、Excel文档等。 4. 强大的计算和合计功能。内置表达式解析系统和函数库。 5. 可扩充性,可以在应用程序中给报表引擎扩充函数库、报表样式和单元格样式。 6.支持多种报表样式,如清单式、分组、交叉表、以及子报表等。 7. 支持多栏式报表。 8. 和应用程序完美结合,支持windows下所有的开发工具和程序语言(例如Delphi、C++、VB、PB、.NET、易语言),最终用户在设计器里可直接选择打印字段,生成表达式,报表设计器用户容易学习理解。 9. 支持脚本和窗体编程,报表设计人员可以编写脚本、在报表设计器里为报表添加窗体,为最终用户提供更丰富的交互功能。 10. 既可以使用应用程序中的数据集,也支持在报表中直接连接各种数据库,通过SQL直接获得报表需要的数据。 11.无失真导出为Excel、Word、Html格式的文档 Ver 2.3主要新增或修改的功能 一、增加的功能: 1、支持二维条码 2、图片单元格支持gif格式 4、增加了一边生成报表一边预览的选项,减少用户的等待感 5、清单报表增加了明细分栏功能。 6、分组报表增加每组分页补充空行功能。 7、清单和分组报表中,补充空行时,可以选择是否显示横线和竖线条。 8、页面选项中增加“保持页脚在页面底部”、“是否套打模板”、“不打印背景图”等选项。 9、增加了批量设置字段别名的方法:SetDataFieldAliasName,使得英文字段在报表中可以用中文展现,更便于最终用户设计报表。 10、在设计器页面左边“报表样式”显示区中单击报表样式标签可以直接调出报表样式设置窗口 11、增加了Delphi下专用的VCL控件(对COM的再次封装,Delphi开发人员使用AC更加简单方便)。 12、Delphi的接口源码中增加了LoadFromCommonBlobField和SaveToCommonBlobField函数,可以直接从一个非ADO的Dataset中装入或保存模板文件。 13、函数优化,在同一页中如果两个或多个公式有公共子公式,则此公共子公式只会执行一次,例如:有以下两个公式: NumToCnText(sum(DocLines, DocLines.LineTotal)/10000, 1) NumToCnText(sum(DocLines, DocLines.LineTotal) * 100, 1) 在运行报表时,sum(DocLines, DocLines.LineTotal) 函数在同页中只会被执行一次。 二、bug修正和功能变动 1、修正了右对齐单元格时,不能及时刷新的问题。 2、修正了调用Init方法后,退出应用程序报错的问题。 3、修正了退出“报表页面选项”窗口后,右下脚属性列表没有及时刷新的问题。 4、在设计器中,如果某行的上边线不可见,则不覆盖上一行单元格的下边线(旧版中会覆盖)。 5、修正了不能撤销粘贴单元格操作的bug 6、修正了页面属性中打印机名称不能保存的问题 三、demo 1、增加了“保存模板到数据库”的demo 2、增加了自定义预览界面的demo 3、增加了分组合并报表demo 4、增加了清单报表在一页中分多栏打印的demo 5、增加了web下的demo 四、其它 1、界面的优化,工具栏风格改变、增加了所选单元格在标尺上的位置标注等。 2、AcRptEngine新增了一些方法,如ClearContents、ExportAcrToStream等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值