基本信息
源码名称:C#调用Fastreport报告打印FTP
源码大小:1.83M
文件格式:.7z
开发语言:C#
更新时间:2024-09-10
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

C#调用Fastreport,实现服务器FTP下载模版打印,本地文件打印

/// <summary>
    /// XML操作类
    /// </summary>
    internal class ToBCBXmlHepler
    {
        /// <summary>
        /// 把数据集的内容转化为报表控件所需的XML字符串
        /// </summary>
        /// <param name="dtTable"></param>
        /// <returns></returns>
        public static string TableToXml(DataTable dtTable)
        {
            StringBuilder printStr = new StringBuilder();
            XmlWriterSettings setting = new XmlWriterSettings
            {
                Indent = true,
                OmitXmlDeclaration = true
            };
            using (XmlWriter printXml = XmlWriter.Create(printStr, setting))
            {//XML头
                printXml.WriteStartElement("xml");
                printXml.WriteAttributeString("version", "1.0");
                printXml.WriteAttributeString("standalone", "yes");
                printXml.WriteStartElement("DATAPACKET");
                printXml.WriteStartElement("METADATA");
                printXml.WriteStartElement("FIELDS");
                //数据字段及数据类型
                foreach (DataColumn column in dtTable.Columns)
                {
                    if (column.DataType.Name == "Int64" || column.DataType.Name == "Boolean"
                        || column.DataType.Name == "String" || column.DataType.Name == "DateTime"
                        || column.DataType.Name == "Decimal" || column.DataType.Name == "Double"
                        || column.DataType.Name == "Int32" || column.DataType.Name == "Single"
                        || column.DataType.Name == "Int16" || column.DataType.Name == "Byte"
                        || column.DataType.Name == "Byte[]")
                    {
                        printXml.WriteStartElement("FIELD");
                        printXml.WriteAttributeString("attrname", column.ColumnName);
                        //字段的数据类型
                        if (column.DataType.Name == "Int64")
                        {  //bigint
                            printXml.WriteAttributeString("fieldtype", "i8");
                            printXml.WriteAttributeString("WIDTH", "8");
                        }
                        else if (column.DataType.Name == "Boolean")
                        {  //bit
                            printXml.WriteAttributeString("fieldtype", "boolean");
                            printXml.WriteAttributeString("WIDTH", "2");
                        }
                        else if (column.DataType.Name == "String")
                        {  //char
                            //如果是Select串这种图片加载方式,传过来的CarImage字段值是字符串,而OCX读图片时的数据类型为"bin.hex"
                            /*
                            if (Column.ColumnName.Contains("CarImage"))
                            {
                                PrintXml.WriteAttributeString("fieldtype", "bin.hex");
                                PrintXml.WriteAttributeString("SUBTYPE", "Binary");
                            }
                            else
                             */
                            {
                                printXml.WriteAttributeString("fieldtype", "string");
                                var maxLength = column.MaxLength;
                                if (maxLength < 0) maxLength = 300;//如果长度为-1传到OCX会出错
                                printXml.WriteAttributeString("WIDTH", maxLength.ToString());
                            }
                        }
                        else if (column.DataType.Name == "DateTime")
                        {  //dateTime
                            printXml.WriteAttributeString("fieldtype", "dateTime");
                            printXml.WriteAttributeString("WIDTH", "16");
                        }
                        else if (column.DataType.Name == "Decimal")
                        {  //Decimal 
                            //PrintXml.WriteAttributeString("fieldtype", "number");
                            //PrintXml.WriteAttributeString("WIDTH", "19");
                            printXml.WriteAttributeString("fieldtype", "fixed");
                            printXml.WriteAttributeString("WIDTH", "18");
                        }
                        else if (column.DataType.Name == "Double")
                        {  //Float
                            //PrintXml.WriteAttributeString("fieldtype", "float");
                            //PrintXml.WriteAttributeString("WIDTH", "8");
                            printXml.WriteAttributeString("fieldtype", "r8");
                            printXml.WriteAttributeString("WIDTH", "8");
                        }
                        else if (column.DataType.Name == "Int32")
                        {  //int
                            printXml.WriteAttributeString("fieldtype", "int");
                            printXml.WriteAttributeString("WIDTH", "4");
                        }
                        else if (column.DataType.Name == "Single")
                        {  //Real r8
                            //PrintXml.WriteAttributeString("fieldtype", "r4");
                            //PrintXml.WriteAttributeString("WIDTH", "4");
                            printXml.WriteAttributeString("fieldtype", "r8");
                            printXml.WriteAttributeString("WIDTH", "8");
                        }
                        else if (column.DataType.Name == "Int16")
                        {  //smallint
                            printXml.WriteAttributeString("fieldtype", "i2");
                            printXml.WriteAttributeString("WIDTH", "2");
                        }
                        else if (column.DataType.Name == "Byte")
                        {  //tinyint
                            //PrintXml.WriteAttributeString("fieldtype", "ui1");
                            //PrintXml.WriteAttributeString("WIDTH", "1");
                            printXml.WriteAttributeString("fieldtype", "i2");
                            //PrintXml.WriteAttributeString("WIDTH", "1");
                        }
                        else if (column.DataType.Name == "Byte[]")//OCX读图片时用的数据类型
                        {  //tinyint
                            printXml.WriteAttributeString("fieldtype", "bin.hex");
                            printXml.WriteAttributeString("SUBTYPE", "Binary");
                        }
                        printXml.WriteEndElement();
                    }
                }
                printXml.WriteEndElement();
                printXml.WriteEndElement();

                printXml.WriteStartElement("ROWDATA");
                foreach (DataRow row in dtTable.Rows)
                {
                    printXml.WriteStartElement("ROW");
                    foreach (DataColumn column in dtTable.Columns)
                    {
                        if (row.IsNull(column))
                            continue;

                        if (column.DataType.Name == "Int64" || column.DataType.Name == "Boolean"
                            || column.DataType.Name == "String" || column.DataType.Name == "DateTime"
                            || column.DataType.Name == "Decimal" || column.DataType.Name == "Double"
                            || column.DataType.Name == "Int32" || column.DataType.Name == "Single"
                            || column.DataType.Name == "Int16" || column.DataType.Name == "Byte"
                            || column.DataType.Name == "Byte[]")
                        {
                            if (column.DataType.Name == "DateTime")
                            {
                                DateTime tmpDateTime = Convert.ToDateTime(row[column]);
                                string tmpStr = tmpDateTime.ToString("yyyy-MM-dd") "T" tmpDateTime.ToString("HH:mm:ss");
                                printXml.WriteAttributeString(column.ColumnName, tmpStr);
                            }
                            else if (column.DataType.Name == "Byte[]")
                            {
                                printXml.WriteAttributeString(column.ColumnName, Convert.ToBase64String((byte[])row[column]));
                            }
                            else
                            {
                                printXml.WriteAttributeString(column.ColumnName, row[column].ToString());
                            }
                        }
                    }
                    printXml.WriteEndElement();
                }
                printXml.WriteEndElement();

                printXml.WriteEndElement();
            }
            //将生成的XML串第一行的首尾加上?,是为了HYPrint.ocx中XML导入DataSet时用到的格式.
            string str = printStr.ToString();
            str = str.Replace("<xml version=\"1.0\" standalone=\"yes\">", "<?xml version=\"1.0\" standalone=\"yes\"?>");
            return str;
        }
        /*生成的例子
            <?xml version="1.0" standalone="yes"?>
                <DATAPACKET version="2.0">
                <METADATA>
                    <FIELDS>
                    <FIELD attrname="Ope_ODate" fieldtype="dateTime" WIDTH="16" />
                    <FIELD attrname="Ope_InfType" fieldtype="int" WIDTH="4" />
                    <FIELD attrname="Ope_InfClass" fieldtype="int" WIDTH="4" />
                    <FIELD attrname="Ope_EmpId" fieldtype="string" WIDTH="10" />
                    <FIELD attrname="Ope_EmpName" fieldtype="string" WIDTH="8" />
                    <FIELD attrname="Ope_SoftName" fieldtype="string" WIDTH="20" />
                    <FIELD attrname="Ope_Computer" fieldtype="string" WIDTH="20" />
                    <FIELD attrname="Ope_Infomation" fieldtype="string" WIDTH="150" />
                    </FIELDS>
                </METADATA>
                <ROWDATA>
                    <ROW Ope_ODate="2012-02-22T17:09:00" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="冀B23142车辆收费记录被删除!" />
                    <ROW Ope_ODate="2012-02-23T09:47:07" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="检测流水号:032012021100005的车辆注册数据被删除!" />
                    <ROW Ope_ODate="2012-02-10T15:14:00" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="备份车辆检测数据,起止日期:2012021020120210" />
                    <ROW Ope_ODate="2012-02-28T16:13:15" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="检测流水号:032012021100005的车辆注册数据被删除!" />
                    <ROW Ope_ODate="2011-06-08T11:57:18" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="备份车辆检测数据,起止日期:2011060820110608" />
                    <ROW Ope_ODate="2011-07-28T09:56:11" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="检测流水号:012011062700001的车辆注册数据被删除!" />
                    <ROW Ope_ODate="2012-02-14T11:49:29" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="冀A-IIIIII车辆收费记录被删除!" />
                    <ROW Ope_ODate="2011-12-21T16:31:08" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="备份车辆检测数据,起止日期:2001122120111221" />
                    <ROW Ope_ODate="2012-02-10T10:29:12" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.167" Ope_Infomation="备份车辆检测数据,起止日期:2010021020120210" />
                    <ROW Ope_ODate="2011-12-21T16:50:50" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="恢复车辆检测数据:G:\HYAis\HYWebMang\\BackFile\2检测数据20111221163359.mdb" />
                    <ROW Ope_ODate="2011-12-21T16:33:59" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="备份车辆检测数据,起止日期:2001122120111221" />
                    <ROW Ope_ODate="2012-03-03T16:48:36" Ope_InfType="1" Ope_InfClass="1" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="档案管理" Ope_Computer="127.0.0.1" Ope_Infomation="删除车辆【冀ASY0001】的车辆信息!" />
                    <ROW Ope_ODate="2012-03-03T16:48:33" Ope_InfType="1" Ope_InfClass="1" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="档案管理" Ope_Computer="127.0.0.1" Ope_Infomation="删除车辆【冀ASY0002】的车辆信息!" />
                    <ROW Ope_ODate="2012-02-10T15:31:04" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.223" Ope_Infomation="备份车辆检测数据,起止日期:2012021020120210" />
                    <ROW Ope_ODate="2012-02-10T10:29:25" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.167" Ope_Infomation="备份车辆检测数据,起止日期:2001021020120210" />
                    <ROW Ope_ODate="2012-02-10T15:32:18" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.223" Ope_Infomation="备份车辆检测数据,起止日期:2012021020120210" />
                    <ROW Ope_ODate="2011-06-02T17:04:24" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="127.0.0.1" Ope_Infomation="备份车辆检测数据,起止日期:2011060220110602" />
                    <ROW Ope_ODate="2012-02-10T15:31:11" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.223" Ope_Infomation="备份车辆检测数据,起止日期:2012021020120210" />
                    <ROW Ope_ODate="2012-02-10T10:28:57" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据维护" Ope_Computer="192.168.1.167" Ope_Infomation="备份车辆检测数据,起止日期:2012021020120210" />
                    <ROW Ope_ODate="2012-02-22T11:14:57" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="冀B12233车辆收费记录被删除!" />
                    <ROW Ope_ODate="2012-02-28T17:04:05" Ope_InfType="1" Ope_InfClass="0" Ope_EmpId="system" Ope_EmpName="system" Ope_SoftName="数据管理" Ope_Computer="127.0.0.1" Ope_Infomation="冀B243322车辆收费记录被删除!" />
                </ROWDATA>
                </DATAPACKET>
            </xml>
         * */

        /// <summary>
        /// 拼写BCB DataSet数据集用XML
        /// </summary>
        /// <param name="det"></param>
        /// <returns></returns>
        public static string GetBcbXml(DataSet det)
        {
            int tablenum = det.Tables.Count;
            string xml = "";
            string rowEnter = "\r\n";
            for (int i = 0; i < tablenum; i )
            {
                xml = "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'" rowEnter;
                xml = "xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'" rowEnter;
                xml = "xmlns:rs='urn:schemas-microsoft-com:rowset'" rowEnter;
                xml = "xmlns:z='#RowsetSchema'>" rowEnter;
                xml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>" rowEnter;
                xml = "<s:Schema id='RowsetSchema'>" rowEnter;
                xml = "<s:ElementType name='row' content='eltOnly' rs:updatable='true'>" rowEnter;

                int rowCount = det.Tables[i].Rows.Count;
                int columnCount = det.Tables[i].Columns.Count;

                for (int j = 0; j < columnCount; j )
                {
                    xml = BcbColumn(det.Tables[i].Columns[j], j 1);
                }
                xml = "<s:extends type='rs:rowbase'/>" rowEnter;
                xml = "</s:ElementType>" rowEnter;
                xml = "</s:Schema>" rowEnter;
                xml = "<rs:data>" rowEnter;

                for (int j = 0; j < rowCount; j )
                {
                    xml = "<z:row";
                    for (int z = 0; z < columnCount; z )
                    {
                        string name = " " det.Tables[i].Columns[z].ColumnName;
                        if (det.Tables[i].Columns[z].DataType == Type.GetType("System.Byte[]"))
                        {
                            byte[] b = new byte[0];
                            if (det.Tables[i].Rows[j][z] != DBNull.Value)
                                b = (byte[])(det.Tables[i].Rows[j][z]);
                            string rowvalue = "";
                            for (int m = 0; m < b.Length; m )
                            {
                                rowvalue = b[m].ToString("X2");
                            }
                            xml = name "='" rowvalue.ToLower() "'";
                        }
                        else
                        {
                            string rowvalue = Convert.ToString(det.Tables[i].Rows[j][z]);
                            xml = name "='" rowvalue "'";
                        }
                    }
                    xml = "/>" rowEnter;
                }
                xml = "</rs:data>" rowEnter;
                xml = "</xml>" rowEnter;
            }
            return xml;
        }

        public static string BcbColumn(DataColumn column, int colounNumber)
        {
            string rowEnter = "\r\n";

            string rowxml = "<s:AttributeType name='" column.ColumnName "' rs:number='" colounNumber.ToString() "' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true' rs:basetable='DataSet'" rowEnter;
            rowxml = " rs:basecolumn='" column.ColumnName "'>" rowEnter;
            if (column.DataType == Type.GetType("System.Byte[]"))
                rowxml = "<s:datatype dt:type='bin.hex' dt:maxLength='1073741823' rs:long='true'/>" rowEnter;
            else
                rowxml = "<s:datatype dt:type='string' dt:maxLength='255'/>" rowEnter;
            rowxml = "</s:AttributeType>" rowEnter;
            return rowxml;
        }

        /// <summary>
        /// 获取XML字符串内字段值
        /// </summary>
        /// <param name="xmlsrc">源字符串</param>
        /// <param name="xmlNode">字符串名称</param>
        /// <returns>返回字符串值 -999为空字符串 -888不适用</returns>
        public static string GetXmlNodeValue(string xmlsrc, string xmlNode)
        {
            string xmlNodeValue = "";
            var nodeStart = $"<{xmlNode}>";
            var nodeEnd = $"</{xmlNode}>";
            if (xmlsrc.Contains(nodeStart) && xmlsrc.Contains(nodeEnd))
            {
                var start = xmlsrc.IndexOf(nodeStart, 0, StringComparison.Ordinal) nodeStart.Length;
                var len = xmlsrc.IndexOf(nodeEnd, 0, StringComparison.Ordinal) - start;
                xmlNodeValue = xmlsrc.Substring(start, len);
            }
            if (xmlNodeValue.Equals("不适用") || xmlNodeValue.Equals("不支持") || xmlNodeValue.Equals("N/A"))
                xmlNodeValue = "-9999";
            return xmlNodeValue;
        }

        /// <summary>
        /// 获取XML字符串内字段值
        /// </summary>
        /// <param name="xmlsrc">源字符串</param>
        /// <param name="xmlNode">字符串名称</param>
        /// <returns>返回字符串值</returns>
        public static string GetXmlValue(string xmlsrc, string xmlNode)
        {
            string xmlNodeValue = "";
            var nodeStart = $"<{xmlNode}>";
            var nodeEnd = $"</{xmlNode}>";
            if (xmlsrc.Contains(nodeStart) && xmlsrc.Contains(nodeEnd))
            {
                var start = xmlsrc.IndexOf(nodeStart, 0, StringComparison.Ordinal) nodeStart.Length;
                var len = xmlsrc.IndexOf(nodeEnd, 0, StringComparison.Ordinal) - start;
                xmlNodeValue = xmlsrc.Substring(start, len);
            }
            return xmlNodeValue;
        }

        /// <summary>
        /// 删除XML中指定的字符串
        /// </summary>
        /// <param name="xmlsrc">源字符串</param>
        /// <param name="xmlNode">字符串名称</param>
        /// <returns>返回字符串值</returns>
        public static string DelXmlAssignStr(string xmlsrc, string xmlNode)
        {
            string xmlValue = xmlsrc;
            var nodeStart = $"<{xmlNode}>";
            var nodeEnd = $"</{xmlNode}>";
            if (xmlsrc.Contains(nodeStart) && xmlsrc.Contains(nodeEnd))
            {
                var start = xmlsrc.IndexOf(nodeStart, 0, StringComparison.Ordinal);
                var len = xmlsrc.IndexOf(nodeEnd, 0, StringComparison.Ordinal) - start nodeEnd.Length;
                xmlValue = xmlsrc.Remove(start, len);
            }
            return xmlValue;
        }
    }