Files
iMES_Net/iMES.Bi.API/CommonHelp.cs
2026-02-06 18:34:35 +08:00

913 lines
32 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using iMES.Bi.Data;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
namespace iMES.Bi.API
{
public class CommonHelp
{
public static T DeepCopyByReflect<T>(T obj)
{
//如果是字符串或值类型则直接返回
if (obj is string || obj.GetType().IsValueType) return obj;
object retval = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
catch { }
}
return (T)retval;
}
/// <summary>
/// 从html中提取纯文本
/// </summary>
/// <param name="strHtml"></param>
/// <returns></returns>
public string StripHT(string strHtml) //从html中提取纯文本
{
Regex regex = new Regex("<.+?>", RegexOptions.IgnoreCase);
string strOutput = regex.Replace(strHtml, "");//替换掉"<"和">"之间的内容
strOutput = strOutput.Replace("<", "");
strOutput = strOutput.Replace(">", "");
strOutput = strOutput.Replace("&nbsp;", "");
return strOutput;
}
/// <summary>
/// 移除html标签
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string RemoveHtml(string html)
{
if (string.IsNullOrEmpty(html)) return html;
Regex regex = new Regex("<.+?>");
var matches = regex.Matches(html);
foreach (Match match in matches)
{
html = html.Replace(match.Value, "");
}
return html;
}
public static string PostWebRequest(string postUrl, string paramData, Encoding dataEncode)
{
string ret = string.Empty;
try
{
byte[] byteArray = dataEncode.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception ex)
{
return ex.Message;
}
return ret;
}
public static HttpWebResponse CreateHttpResponse(string url, IDictionary<string, string> parameters, int timeout, string userAgent, CookieCollection cookies, string strType = "POST")
{
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
//request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = strType;
request.ContentType = "application/x-www-form-urlencoded";
//设置代理UserAgent和超时
//request.UserAgent = userAgent;
//request.Timeout = timeout;
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//发送POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
i++;
}
}
byte[] data = Encoding.UTF8.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
string[] values = request.Headers.GetValues("Content-Type");
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int timeout, string userAgent, CookieCollection cookies, string strType = "POST")
{
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
//request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = strType;
request.ContentType = "application/x-www-form-urlencoded";
//设置代理UserAgent和超时
//request.UserAgent = userAgent;
//request.Timeout = timeout;
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//发送POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
i++;
}
}
byte[] data = Encoding.UTF8.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
string[] values = request.Headers.GetValues("Content-Type");
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 获取请求的数据
/// </summary>
public static string GetResponseString(HttpWebResponse webresponse)
{
using (Stream s = webresponse.GetResponseStream())
{
StreamReader reader = new StreamReader(s, Encoding.Default);
return reader.ReadToEnd();
}
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="table"></param>
/// <param name="fileName"></param>
public static MemoryStream RenderToExcel(DataTable table)
{
MemoryStream ms = new MemoryStream();
using (table)
{
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet();
IRow headerRow = sheet.CreateRow(0);
// handling header.
foreach (DataColumn column in table.Columns)
headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value
// handling value.
int rowIndex = 1;
foreach (DataRow row in table.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in table.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
}
rowIndex++;
}
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
}
//using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
//{
// byte[] data = ms.ToArray();
// fs.Write(data, 0, data.Length);
// fs.Flush();
// data = null;
//}
return ms;
}
//
public static bool HasData(Stream excelFileStream)
{
using (excelFileStream)
{
IWorkbook workbook = new HSSFWorkbook(excelFileStream);
if (workbook.NumberOfSheets > 0)
{
ISheet sheet = workbook.GetSheetAt(0);
return sheet.PhysicalNumberOfRows > 0;
}
}
return false;
}
public static string SendDX(string Mobile, string Content, string SendTime)
{
try
{
string returnData = "";
// string url = CommonHelp.GetConfig("DXURL") + "&Mobile=" + Mobile + "&Content=" + Content;
if (CommonHelp.GetConfig("DXURL") != "")
{
string url = CommonHelp.GetConfig("DXURL") + "&phone=" + Mobile + "&msg=" + Content;
CommonHelp.WriteLOG(url);
WebClient WC = new WebClient();
WC.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
int p = url.IndexOf("?");
string sData = url.Substring(p + 1);
url = url.Substring(0, p);
byte[] postData = Encoding.GetEncoding("gb2312").GetBytes(sData);
byte[] responseData = WC.UploadData(url, "POST", postData);
returnData = Encoding.GetEncoding("gb2312").GetString(responseData);
}
return returnData;
}
catch (Exception Ex)
{
return Ex.Message;
}
}
public static HSSFWorkbook ExportToExcel(DataTable dt)
{
HSSFWorkbook workbook = new HSSFWorkbook();
if (dt.Rows.Count > 0)
{
ISheet sheet = workbook.CreateSheet("Sheet1");
ICellStyle HeadercellStyle = workbook.CreateCellStyle();
HeadercellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
HeadercellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
HeadercellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
HeadercellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
HeadercellStyle.Alignment = HorizontalAlignment.Center;
HeadercellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.SkyBlue.Index;
HeadercellStyle.FillPattern = FillPattern.SolidForeground;
HeadercellStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.SkyBlue.Index;
//字体
NPOI.SS.UserModel.IFont headerfont = workbook.CreateFont();
headerfont.Boldweight = (short)FontBoldWeight.Bold;
headerfont.FontHeightInPoints = 12;
HeadercellStyle.SetFont(headerfont);
//用column name 作为列名
int icolIndex = 0;
IRow headerRow = sheet.CreateRow(0);
foreach (DataColumn dc in dt.Columns)
{
ICell cell = headerRow.CreateCell(icolIndex);
cell.SetCellValue(dc.ColumnName);
cell.CellStyle = HeadercellStyle;
icolIndex++;
}
ICellStyle cellStyle = workbook.CreateCellStyle();
//为避免日期格式被Excel自动替换所以设定 format 为 『@』 表示一率当成text來看
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("@");
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
NPOI.SS.UserModel.IFont cellfont = workbook.CreateFont();
cellfont.Boldweight = (short)FontBoldWeight.Normal;
cellStyle.SetFont(cellfont);
//建立内容行
int iRowIndex = 0;
foreach (DataRow dr in dt.Rows)
{
int iCellIndex = 0;
IRow irow = sheet.CreateRow(iRowIndex + 1);
for (int i = 0; i < dt.Columns.Count; i++)
{
string strsj = string.Empty;
if (dr[i] != null)
{
strsj = dr[i].ToString();
}
ICell cell = irow.CreateCell(iCellIndex);
cell.SetCellValue(strsj);
cell.CellStyle = cellStyle;
iCellIndex++;
}
iRowIndex++;
}
//自适应列宽度
for (int i = 0; i < icolIndex; i++)
{
sheet.AutoSizeColumn(i);
}
//using (MemoryStream ms = new MemoryStream())
//{
// workbook.Write(ms);
// HttpContext curContext = HttpContext.Current;
// // 设置编码和附件格式
// curContext.Response.ContentType = "application/vnd.ms-excel";
// curContext.Response.ContentEncoding = Encoding.UTF8;
// curContext.Response.Charset = "";
// curContext.Response.AppendHeader("Content-Disposition",
// "attachment;filename=" + HttpUtility.UrlEncode(Name + "_导出文件_" + DateTime.Now.Ticks + ".xls", Encoding.UTF8));
// curContext.Response.BinaryWrite(ms.GetBuffer());
// workbook = null;
// ms.Close();
// ms.Dispose();
// curContext.Response.End();
//}
}
return workbook;
}
public DataTable ExcelToTable(Stream stream, int headrow, string suffix)
{
DataTable dt = new DataTable();
IWorkbook workbook = null;
if (suffix == "xlsx") // 2007版本
{
workbook = new XSSFWorkbook(stream);
}
else if (suffix == "xls") // 2003版本
{
workbook = new HSSFWorkbook(stream);
}
//获取excel的第一个sheet
ISheet sheet = workbook.GetSheetAt(0);
//获取sheet的第一行
IRow headerRow = sheet.GetRow(headrow);
//一行最后一个方格的编号 即总的列数
int cellCount = headerRow.LastCellNum;
//最后一列的标号 即总的行数
int rowCount = sheet.LastRowNum;
//列名
for (int i = 0; i < cellCount; i++)
{
dt.Columns.Add(headerRow.GetCell(i).ToString());
}
for (int i = (sheet.FirstRowNum + headrow + 1); i <= sheet.LastRowNum; i++)
{
DataRow dr = dt.NewRow();
IRow row = sheet.GetRow(i);
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dr[j] = row.GetCell(j).ToString();
}
}
dt.Rows.Add(dr);
}
sheet = null;
workbook = null;
return dt;
}
public static string HttpGet(string Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
public static string GetAPIData(string strUrl)
{
string strReturn = "";
string strHost = GetConfig("APITX");
strHost = strHost.Substring(0, strHost.IndexOf("/api"));
strReturn = CommonHelp.HttpGet(strUrl.Replace("$API_HOST", strHost));
return strReturn;
}
private int rep = 0;
/// <summary>
/// 生成随机不重复的字符串(分享码用)
/// </summary>
/// <param name="codeCount"></param>
/// <returns></returns>
public string GenerateCheckCode(int codeCount)
{
string str = string.Empty;
long num2 = DateTime.Now.Ticks + this.rep;
this.rep++;
Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> this.rep)));
for (int i = 0; i < codeCount; i++)
{
char ch;
int num = random.Next();
if ((num % 2) == 0)
{
ch = (char)(0x30 + ((ushort)(num % 10)));
}
else
{
ch = (char)(0x41 + ((ushort)(num % 0x1a)));
}
str = str + ch.ToString();
}
return str;
}
/// <summary>
/// MD5加密
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
public static string GetMD5(string content)
{
using (var md5 = MD5.Create())
{
var result = md5.ComputeHash(Encoding.ASCII.GetBytes(content));
var strResult = BitConverter.ToString(result);
return strResult.Replace("-", "");
}
}
public static string GetConfig(string strKey, string strDefault = "")
{
return Appsettings.app(strKey) ?? strDefault;
}
/// <summary>
/// 获取数字验证码
/// </summary>
/// <param name="codenum"></param>
/// <returns></returns>
public static string numcode(int codenum)
{
string Vchar = "0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9";
string[] VcArray = Vchar.Split(',');
string[] stray = new string[codenum];
Random random = new Random();
for (int i = 0; i < codenum; i++)
{
int iNum = 0;
while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
{
iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
}
stray[i] = VcArray[iNum];
}
string identifycode = string.Empty;
foreach (string s in stray)
{
identifycode += s;
}
return identifycode;
}
/// <summary>
/// 登录验证码
/// </summary>
/// <param name="codenum"></param>
/// <returns></returns>
public static string yzmcode(int codenum)
{
string Vchar = "0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
string[] VcArray = Vchar.Split(',');
string[] stray = new string[codenum];
Random random = new Random();
for (int i = 0; i < codenum; i++)
{
int iNum = 0;
while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
{
iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
}
stray[i] = VcArray[iNum];
}
string identifycode = string.Empty;
foreach (string s in stray)
{
identifycode += s;
}
return identifycode;
}
private static bool IsIPAddress(string str1)
{
if (str1 == null || str1 == string.Empty || str1.Length < 7 || str1.Length > 15) return false;
string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$";
Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
return regex.IsMatch(str1);
}
public static void WriteLOG(string err)
{
try
{
string path = AppContext.BaseDirectory;// .NET CORE
//string path = HttpContext.Current.Request.MapPath("/");
if (!Directory.Exists(path + "/log/"))
{
Directory.CreateDirectory(path + "/log/");
}
string name = DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
if (!File.Exists(path + "/log/" + name))
{
FileInfo myfile = new FileInfo(path + "/log/" + name);
FileStream fs = myfile.Create();
fs.Close();
}
StreamWriter sw = File.AppendText(path + "/log/" + name);
sw.WriteLine(err + "\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
sw.Flush();
sw.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public static bool ProcessSqlStr(string Str, int type)
{
string SqlStr = "";
if (type == 1) //Post方法提交
{
SqlStr = "script|iframe|xp_loginconfig|xp_fixeddrives|Xp_regremovemultistring|Xp_regread|Xp_regwrite|xp_cmdshell|xp_dirtree|count(|substring(|mid(|master|truncate|char(|declare|replace(|varchar(|cast(";
}
else if (type == 2) //Get方法提交
{
SqlStr = "'|script|iframe|xp_loginconfig|xp_fixeddrives|Xp_regremovemultistring|Xp_regread|Xp_regwrite|xp_cmdshell|xp_dirtree|count(|*|asc(|chr(|substring(|mid(|master|truncate|char(|declare|replace(|;|varchar(|cast(";
}
else if (type == 3) //Cookie提交
{
SqlStr = "script|iframe|xp_loginconfig|xp_fixeddrives|Xp_regremovemultistring|Xp_regread|Xp_regwrite|xp_cmdshell|xp_dirtree|count(|asc(|chr(|substring(|mid(|master|truncate|char(|declare";
}
else //默认Post方法提交
{
SqlStr = "script|iframe|xp_loginconfig|xp_fixeddrives|Xp_regremovemultistring|Xp_regread|Xp_regwrite|xp_cmdshell|xp_dirtree|count(|asc(|chr(|substring(|mid(|master|truncate|char(|declare|replace(";
}
bool ReturnValue = true;
try
{
if (Str != "")
{
string[] anySqlStr = SqlStr.ToUpper().Split('|'); ;
foreach (string ss in anySqlStr)
{
if (Str.ToUpper().IndexOf(ss) >= 0)
{
ReturnValue = false;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
public static string Filter(string str)
{
string[] pattern = { "insert ", "delete", "count\\(", "drop table", "update", "truncate", "xp_cmdshell", "exec   master", "netlocalgroup administrators", "net use " };
for (int i = 0; i < pattern.Length; i++)
{
str = str.Replace(pattern[i].ToString(), "");
}
return str;
}
public static string CreateqQsql(string strQFiled, string strQtype, string strQvalue)
{
string strSQL = " AND ";
strSQL = strSQL + strQFiled;
if (strQtype == "0")
{
strSQL = strSQL + " = ";
}
strSQL = strSQL + "'" + strQvalue + "'";
return strSQL.FilterSpecial();
}
/// <summary>
/// 生成流水号格式8位日期加3位顺序号如20100302001。
/// </summary>
public static string GetWFNumber(string serialNumber, string ywcode, string strWFQZ)
{
if (serialNumber.Length < 13)
{
strWFQZ = "1";
//没法子,只能曲线救国
}
string strLSTemp = strWFQZ == "0" ? "yyyyMMdd" : "yyyy";
if (serialNumber != "0" && serialNumber != "")
{
string headDate = serialNumber.Substring(ywcode.Length + 1, strLSTemp.Length);
int lastNumber = int.Parse(serialNumber.Substring(ywcode.Length + 1 + strLSTemp.Length));
//如果数据库最大值流水号中日期和生成日期在同一天则顺序号加1
if (headDate == DateTime.Now.ToString(strLSTemp))
{
lastNumber++;
return ywcode + "-" + headDate + lastNumber.ToString("000");
}
}
return ywcode + "-" + DateTime.Now.ToString(strLSTemp) + "001";
}
/// <summary>
/// 转化时分秒
/// </summary>
/// <param name="strSFM"></param>
/// <returns></returns>
public static int GetSencond(string strSFM)
{
int[] ListTemp = strSFM.SplitTOInt(':');
return ListTemp[0] * 3600 + ListTemp[1] * 60 + ListTemp[2];
}
/// <summary>
/// 在DataTable末尾添加合计行最后一个参数设置需要合计的列Tools.dbDataTableSumRowsWithColList(dt,"车号",new string[]{"个人产值","节油(元)","超油(元)"});
/// </summary>
/// <param name="dt"></param>
/// <param name="nColHeJi">需要显示‘合计’字段的列</param>
/// <param name="colsHeJi">需要合计的列</param>
public static DataRow dbDataTableSumRowsWithColList(DataTable dt, string sColHeJi, string[] colsHeJi)
{
DataRow dr = dt.NewRow();
dr[sColHeJi] = "合计";
dt.Rows.Add(dr);
//初始化合计数组
decimal[] arrDec = new decimal[colsHeJi.Length];
for (int i = 0; i < colsHeJi.Length; i++)
{
arrDec[i] = decimal.Zero;
}
//合计
for (int i = 0; i < dt.Rows.Count - 1; i++)
{
for (int j = 0; j < colsHeJi.Length; j++)
{
string cName = colsHeJi[j];
if (Convert.IsDBNull(dt.Rows[i][cName])) continue;
arrDec[j] += decimal.Parse(dt.Rows[i][cName] + "");
}
}
//赋值
for (int i = 0; i < colsHeJi.Length; i++)
{
string cName = colsHeJi[i];
if (arrDec[i] == decimal.Zero) dr[cName] = "0";
else dr[cName] = arrDec[i];
}
return dr;
}
/// <summary>
/// 分类小计,并有合计行,
/// </summary>
/// <param name="dt"></param>
/// <param name="nColHeJi">需要显示‘合计’字段的列</param>
/// <param name="colsHeJi">需要合计的列</param>
public static DataRow dbDataTableSubSumRowsWithColList(DataTable dt, string sColHeJi, string strGroupName, string[] colsHeJi)
{
DataRow dr = dt.NewRow();
dr[sColHeJi] = "合计";
dt.Rows.Add(dr);
//初始化合计数组
decimal[] arrDec = new decimal[colsHeJi.Length];
for (int i = 0; i < colsHeJi.Length; i++)
{
arrDec[i] = decimal.Zero;
}
//合计
for (int i = 0; i < dt.Rows.Count - 1; i++)
{
for (int j = 0; j < colsHeJi.Length; j++)
{
string cName = colsHeJi[j];
if (Convert.IsDBNull(dt.Rows[i][cName])) continue;
arrDec[j] += decimal.Parse(dt.Rows[i][cName] + "");
}
}
for (int i = 0; i < colsHeJi.Length; i++)
{
string cName = colsHeJi[i];
if (arrDec[i] == decimal.Zero) dr[cName] = 0;
else dr[cName] = arrDec[i];
}
if (dt.Rows.Count <= 1) return dr;
//小计
string sRate = "";
int currSubSumCol = dt.Rows.Count - 2;
ArrayList ar = new ArrayList();
for (int i = dt.Rows.Count - 2; i >= 0; i--)
{
string currRate = dt.Rows[i][strGroupName] + "";
if (sRate != currRate)
{
if (i != dt.Rows.Count - 2)
{
dr = dt.NewRow();
dr[sColHeJi] = "小计";
for (int j = 0; j < colsHeJi.Length; j++)
{
string cName = colsHeJi[j];
if (arrDec[j] == decimal.Zero) dr[cName] = 0;
else dr[cName] = arrDec[j];
}
dt.Rows.InsertAt(dr, currSubSumCol + 1);
}
currSubSumCol = i;
sRate = currRate;
for (int j = 0; j < colsHeJi.Length; j++)
{ //归零
arrDec[j] = decimal.Zero;
}
}
for (int j = 0; j < colsHeJi.Length; j++)
{
string cName = colsHeJi[j];
if (Convert.IsDBNull(dt.Rows[i][cName])) continue;
arrDec[j] += decimal.Parse(dt.Rows[i][cName] + "");
}
if (i == 0)
{
dr = dt.NewRow();
dr[sColHeJi] = "小计";
for (int j = 0; j < colsHeJi.Length; j++)
{
string cName = colsHeJi[j];
if (arrDec[j] == decimal.Zero) dr[cName] = 0;
else dr[cName] = arrDec[j];
}
dt.Rows.InsertAt(dr, currSubSumCol + 1);
}
}
return dr;
}
}
}