C# 钉钉接口-给用户发钉盘文件消息/钉盘文件上传
钉钉接口 给用户发钉盘文件消息
步骤概括:
- 创建一个用于企业内部开发的H5微应用。将文件发送给指定用户,用户将收到以次应用名义发送的一条文件消息
- 服务端调用“单步上传文件”接口,上传文件获取mediaId
- 服务端调用“发送钉盘文件给指定用户”接口,把钉盘文件当做消息内容发送给用户
这里省略创建微应用的步骤。
步骤1:获取access_token (GET)
请求地址:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret
返回说明
{ "errcode": 0, "errmsg": "ok", "access_token": "fw8ef8we8f76e6f7s8df8s" }
步骤2:调用“单步上传文件”接口,上传文件获取mediaId (POST)
文件大小 取字节;
返回说明
{ "media_id": "xxxxxxxx", "errcode":0, "errmsg":"ok" }
步骤3:发送钉盘文件给指定用户(POST)
media_id 和file_name需要转成urlEncode格式,{"errcode":40007,"errmsg":"不合法的媒体文件id"}除了media_id 不存在、为空,还有一个原因是因为没有转格式
引用 System.Web.HttpUtility;
HttpUtility.UrlEncode(" 内容 ");
返回结果
{ "errcode":0, "errmsg":"ok" }
下面贴上代码:

using System.Text; using System.IO; using System.Data; using System.Collections; using TWays.Core.DBAccess; using Newtonsoft.Json; public class DDManager { #region 公共方法 /// <summary> /// 记录日志 /// </summary> /// <param name="strMsg"></param> private void Logger(string strMsg) { string strFilePath = System.Windows.Forms.Application.StartupPath + "\\" + StaticConst.WxSendLog; TWays.Core.Loger.LogMessage(strFilePath, strMsg, true); } //我这里是把钉钉的一些信息存在了数据库里 //像APP_KEY、APP_SECRET之类的,根据自己定义的类型读取信息 private DataSet GetValue(string type) { DataSet dr = DataAdapter.Query(string.Format(SqlText.selectDDTypeValue.ToUpper(), type)); return dr; } #endregion #region 获取配置信息 /// <summary> /// 获取微应用名称 /// </summary> /// <returns></returns> public string GetAppMicorName(string type) { DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["DIC_NAME"]); } /// <summary> /// 获取APP_KEY /// </summary> /// <returns></returns> public string GetDDAppKey(string type) { //return GetConfigValue(StaticConst.WX_APP_ID); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["APP_KEY"]); } /// <summary> /// 获取APP_SECRET /// </summary> /// <returns></returns> public string GetDDAppSecret(string type) { //return GetConfigValue(StaticConst.WX_APP_SECRET); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["APP_SECRET"]); } /// <summary> /// 获取微应用id AGEN_ID /// </summary> /// <returns></returns> public string GetDDAgenId(string type) { //return GetConfigValue(StaticConst.WX_QY_CORP_ID); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["AGEN_ID"]); } /// <summary> /// 获取配置信息 /// </summary> /// <param name="strKey"></param> /// <returns></returns> public string GetConfigValue(string strKey) { string strKeyValue = string.Empty; strKeyValue = TWays.Utils.ToString(System.Configuration.ConfigurationManager.AppSettings[strKey]); return strKeyValue; } #endregion #region 获取POST消息 /// <summary> /// 获取post返回来的数据 /// </summary> /// <returns></returns> public static string PostInput() { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); return Encoding.UTF8.GetString(b); } #endregion #region 获取企业号AccessToken public string GetQyAccessToken(string type) { string QY_AppKey = this.GetDDAppKey(type);//钉钉的APP_KEY string QY_AppSecret = this.GetDDAppSecret(type);// string url = string.Format("https://oapi.dingtalk.com/gettoken?appkey={0}&appsecret={1}", QY_AppKey, QY_AppSecret); return ToAccessTokenJson(HttpRequestUtil.GetAppPage(url, 5000, Encoding.UTF8)); } public string ToAccessTokenJson(string val) { AccessToken deserializedToken = (AccessToken)JavaScriptConvert.DeserializeObject(val, typeof(AccessToken)); return deserializedToken.access_token; } #endregion #region 获取MediaId public string GetQyMediaId(string type, decimal size, string path) { string QY_MediaId = string.Empty; string strAccessToken = this.GetQyAccessToken(type); string strAgenId = this.GetDDAgenId(type); string url = string.Format("https://oapi.dingtalk.com/file/upload/single?access_token={0}&agent_id={1}&file_size={2}", strAccessToken, strAgenId, size); QY_MediaId = ToAccessMediaId(HttpRequestUtil.HttpPosturl(path, url)); return QY_MediaId; } public string ToAccessMediaId(string val) { ThumbMedia deserializedMediaId = (ThumbMedia)JavaScriptConvert.DeserializeObject(val, typeof(ThumbMedia)); return deserializedMediaId.media_id; } #endregion #region 获取用户id(判断用户是否存在) public string GetQyUserId(string token, string userId) { string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", token, userId); return ToUserJson(HttpRequestUtil.GetAppPage(url, 5000, Encoding.UTF8)); } public string ToUserJson(string val) { Hashtable t = (Hashtable)JavaScriptConvert.DeserializeObject(val, typeof(Hashtable)); if (t["errcode"].ToString() == "0") { return t["userid"].ToString(); } return ""; //User deserializedToken = (User)JavaScriptConvert.DeserializeObject(val, typeof(User)); //return deserializedToken.userid; } #endregion }

public class ExportExcel { public static void ExportToText(System.Data.DataTable dt, String filename) { ExportToText(dt, filename, false); } /// <summary> /// 快速导出文本 /// </summary> /// <param name="devXtraGrid"></param> /// <param name="filename"></param> public static void ExportToText(System.Data.DataTable dt, String filename, bool isFirst) { if (dt == null) return; string strPath = filename; try { //先打印标头 StringBuilder strColu = new StringBuilder(); StringBuilder strValue = new StringBuilder(); string strColText = string.Empty; string strColHeadText = string.Empty; StreamWriter sw = null; if (File.Exists(filename)) { sw = new StreamWriter(new FileStream(strPath, FileMode.Append), Encoding.GetEncoding("GB2312")); } else { sw = new StreamWriter(new FileStream(strPath, FileMode.Create), Encoding.GetEncoding("GB2312")); } using (sw) { sw.AutoFlush = true; if (isFirst) { //先打印表头 for (int i = 0; i <= dt.Columns.Count - 1; i++) { strColHeadText = dt.Columns[i].ColumnName; if (string.IsNullOrEmpty(strColHeadText)) { strColHeadText = TWays.Utils.ToString(dt.Columns[i].ColumnName); } strColu.Append(strColHeadText); strColu.Append("\t"); } strColu.Remove(strColu.Length - 1, 1);//移出掉最后一个,字符 } sw.WriteLine(strColu); for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt.Rows[i]; if (dr != null) { strValue.Remove(0, strValue.Length);//移出 for (int j = 0; j <= dt.Columns.Count - 1; j++) { strColText = string.Empty; if (dr[j] != null) { strColText = dr[j].ToString(); } strValue.Append(strColText); strValue.Append("\t"); } strValue.Remove(strValue.Length - 1, 1);//移出掉最后一个,字符 sw.WriteLine(strValue); } } sw.Flush(); sw.Close(); sw.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// <summary> /// 快速导出文本 /// </summary> /// <param name="devXtraGrid"></param> /// <param name="filename"></param> public static void ExportToTextForBudget(System.Data.DataTable dt, System.Data.DataTable dtDate, String filename) { if (dt == null) return; string strPath = filename; try { //先打印标头 bool isFirst = true; StringBuilder strColu = new StringBuilder(); StringBuilder strValue = new StringBuilder(); string strColText = string.Empty; string strColHeadText = string.Empty; StreamWriter sw = null; if (File.Exists(filename)) { sw = new StreamWriter(new FileStream(strPath, FileMode.Append), Encoding.GetEncoding("GB2312")); } else { sw = new StreamWriter(new FileStream(strPath, FileMode.Create), Encoding.GetEncoding("GB2312")); } using (sw) { sw.AutoFlush = true; if (isFirst) { string strAmtColName = string.Empty; //先打印表头 for (int i = 0; i <= dt.Columns.Count - 1; i++) { strColHeadText = dt.Columns[i].ColumnName; if (strColHeadText.ToUpper().Contains("_AMT_")) { DataRow[] dr = dtDate.Select("COLUMN_NAME = '" + strColHeadText + "'"); if (dr.Length > 0) { strColHeadText = TWays.Utils.ToString(dr[0]["COLUMN_VALUE"]); } } else if (strColHeadText.ToUpper().Contains("A")) { strColHeadText = strColHeadText.Replace("A", ""); } strColu.Append(strColHeadText); strColu.Append("\t"); } strColu.Remove(strColu.Length - 1, 1);//移出掉最后一个,字符 } sw.WriteLine(strColu); for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt.Rows[i]; if (dr != null) { strValue.Remove(0, strValue.Length);//移出 for (int j = 0; j <= dt.Columns.Count - 1; j++) { strColText = string.Empty; if (dr[j] != null) { strColText = dr[j].ToString(); } strValue.Append(strColText); strValue.Append("\t"); } strValue.Remove(strValue.Length - 1, 1);//移出掉最后一个,字符 sw.WriteLine(strValue); } } sw.Flush(); sw.Close(); sw.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// <summary> /// 通过StreamWriter写 /// </summary> /// <param name="dataSet"></param> /// <param name="dsWeek"></param> /// <param name="strOperDate"></param> /// <param name="fileName"></param> /// <returns></returns> public static bool WriteToText(DataSet dataSet, DataSet dsWeek, string strOperDate, string fileName, bool isFirst) { string strPath = fileName; System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNumber = dataTable.Rows.Count;//不包括字段名 if (rowNumber == 0) { return false; } StringBuilder sb = new StringBuilder(); StringBuilder sbValue = new StringBuilder(); StreamWriter sw = null; if (File.Exists(fileName)) { sw = new StreamWriter(new FileStream(strPath, FileMode.Append), Encoding.GetEncoding("GB2312")); } else { sw = new StreamWriter(new FileStream(strPath, FileMode.Create), Encoding.GetEncoding("GB2312")); } using (sw) { string strColName = string.Empty; string[] strWeekNum; int iWeekNum; string strWeekColName = string.Empty; sw.AutoFlush = true; try { if (isFirst) { int iColIndex = 0; //生成字段名称 foreach (DataColumn col in dataTable.Columns) { strColName = col.ColumnName; if (strColName.Contains("WEEK_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[2]); strWeekColName = Convert.ToDateTime(TWays.Utils.ToString(dsWeek.Tables[0].Select(" WEEK_NUM = " + iWeekNum + " AND YEAR =" + Convert.ToInt32(strWeekNum[1]))[0]["BEGIN_DATE"])).ToString("MM/dd"); strColName = strWeekColName; } else if (strColName.Contains("DAY_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[1]); strWeekColName = Convert.ToDateTime(strOperDate).AddDays(-iWeekNum).ToString("MM/dd"); strColName = strWeekColName; } sb.Append(strColName); sb.Append("\t"); iColIndex++; } sb.Remove(sb.Length - 1, 1);//移出掉最后一个,字符 sw.WriteLine(sb); } string strValue = string.Empty; //生成数据 for (int i = 0; i < dataTable.Rows.Count; i++) { sbValue.Remove(0, sbValue.Length);//移出 for (int j = 0; j < dataTable.Columns.Count; j++) { strValue = TWays.Utils.ToString(dataTable.Rows[i][j]); strValue = strValue.Replace("\r", ""); strValue = strValue.Replace("\n", ""); strValue = strValue.Replace("\t", ""); strValue = strValue.Replace("\"", ""); sbValue.Append(strValue); sbValue.Append("\t"); } sbValue.Remove(sbValue.Length - 1, 1);//移出掉最后一个,字符 sw.WriteLine(sbValue); } sw.Flush(); sw.Close(); sw.Dispose(); } catch (Exception ex) { throw ex; } finally { sw = null; sb = null; dataTable = null; dataSet = null; dsWeek = null; GC.Collect(); } } return true; } /// <summary> /// 添加到压缩文件 /// </summary> /// <param name="strzipPath"></param> /// <param name="strtxtPath"></param> /// <returns></returns> public static string CreateRar(string strzipPath, string strtxtPath) { string strResult = string.Empty; try { if (File.Exists(strzipPath)) { File.Delete(strzipPath); } System.Diagnostics.Process Process1 = new System.Diagnostics.Process(); Process1.StartInfo.FileName = "Winrar.exe"; Process1.StartInfo.CreateNoWindow = true; //Process1.StartInfo.Arguments = " a -r " + strzipPath + " " + strtxtPath; Process1.StartInfo.Arguments = " a -ep " + strzipPath + " " + strtxtPath; Process1.Start(); } catch (Exception ex) { strResult = ex.Message; } return strResult; } /// <summary> /// 导出到Excel /// </summary> /// <param name="dataSet"></param> /// <param name="fileName"></param> /// <returns></returns> public static bool DataSetToExcel(DataSet dataSet, string fileName) { if (File.Exists(fileName)) { File.SetAttributes(fileName, FileAttributes.Normal); File.Delete(fileName); } System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNumber = dataTable.Rows.Count;//不包括字段名 int columnNumber = dataTable.Columns.Count; int colIndex = 0; //if (rowNumber == 0) //{ // return false; //} //建立Excel对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; excel.Visible = false; Microsoft.Office.Interop.Excel.Range range; //生成字段名称 foreach (DataColumn col in dataTable.Columns) { colIndex++; excel.Cells[1, colIndex] = col.ColumnName; } object[,] objData = new object[rowNumber, columnNumber]; for (int r = 0; r < rowNumber; r++) { for (int c = 0; c < columnNumber; c++) { objData[r, c] = dataTable.Rows[r][c]; } } // 写入Excel range = worksheet.get_Range(excel.Cells[2, 1], excel.Cells[rowNumber + 1, columnNumber]); range.NumberFormat = "@";//设置单元格为文本格式 range.Value2 = objData; workbook.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); try { workbook.Saved = true; excel.UserControl = false; } catch (Exception exception) { MessageBox.Show(exception.Message); } finally { workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Missing.Value, Missing.Value); excel.Quit(); workbook = null; worksheet = null; excel = null; range = null; } return true; } /// <summary> /// 导出到Excel /// </summary> /// <param name="dataSet"></param> /// <param name="fileName"></param> /// <returns></returns> public static bool DataSetToExcel(DataSet dataSet, DataSet dsWeek, string strOperDate, string fileName) { if (File.Exists(fileName)) { File.Delete(fileName); } System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNumber = dataTable.Rows.Count;//不包括字段名 int columnNumber = dataTable.Columns.Count; int colIndex = 0; if (rowNumber == 0) { return false; } //建立Excel对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; excel.Visible = false; Microsoft.Office.Interop.Excel.Range range; string strColName = string.Empty; string[] strWeekNum; int iWeekNum; string strWeekColName = string.Empty; //生成字段名称 foreach (DataColumn col in dataTable.Columns) { strColName = col.ColumnName; if (strColName.Contains("WEEK_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[2]); strWeekColName = Convert.ToDateTime(TWays.Utils.ToString(dsWeek.Tables[0].Select(" WEEK_NUM = " + iWeekNum + " AND YEAR =" + Convert.ToInt32(strWeekNum[1]))[0]["BEGIN_DATE"])).ToString("MM/dd"); strColName = strWeekColName; } else if (strColName.Contains("DAY_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[1]); strWeekColName = Convert.ToDateTime(strOperDate).AddDays(-iWeekNum).ToString("MM/dd"); strColName = strWeekColName; } colIndex++; excel.Cells[1, colIndex] = strColName; } object[,] objData = new object[rowNumber, columnNumber]; for (int r = 0; r < rowNumber; r++) { for (int c = 0; c < columnNumber; c++) { objData[r, c] = dataTable.Rows[r][c]; } } // 写入Excel range = worksheet.get_Range(excel.Cells[2, 1], excel.Cells[rowNumber + 1, columnNumber]); range.NumberFormat = "@";//设置单元格为文本格式 range.Value2 = objData; //range.Value = objData; workbook.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); try { workbook.Saved = true; excel.UserControl = false; GC.Collect(); } catch (Exception exception) { MessageBox.Show(exception.Message); } finally { workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Missing.Value, Missing.Value); excel.Quit(); workbook = null; worksheet = null; excel = null; range = null; } return true; } /// <summary> /// 通过StreamWriter写 /// </summary> /// <param name="dataSet"></param> /// <param name="dsWeek"></param> /// <param name="strOperDate"></param> /// <param name="fileName"></param> /// <returns></returns> public static bool WriteToExcel(DataSet dataSet, DataSet dsWeek, string strOperDate, string fileName) { if (File.Exists(fileName)) { File.Delete(fileName); } System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNumber = dataTable.Rows.Count;//不包括字段名 if (rowNumber == 0) { return false; } StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("gb2312")); StringBuilder sb = new StringBuilder(); string strColName = string.Empty; string[] strWeekNum; int iWeekNum; string strWeekColName = string.Empty; try { int iColIndex = 0; //生成字段名称 foreach (DataColumn col in dataTable.Columns) { strColName = col.ColumnName; if (strColName.Contains("WEEK_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[2]); strWeekColName = Convert.ToDateTime(TWays.Utils.ToString(dsWeek.Tables[0].Select(" WEEK_NUM = " + iWeekNum + " AND YEAR =" + Convert.ToInt32(strWeekNum[1]))[0]["BEGIN_DATE"])).ToString("MM/dd"); strColName = strWeekColName; } else if (strColName.Contains("DAY_")) { strWeekNum = strColName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); iWeekNum = Convert.ToInt32(strWeekNum[1]); strWeekColName = Convert.ToDateTime(strOperDate).AddDays(-iWeekNum).ToString("MM/dd"); strColName = strWeekColName; } sb.Append(strColName); if (iColIndex < dataTable.Columns.Count - 1) { sb.Append("\t"); } iColIndex++; } sb.Append(Environment.NewLine); string strValue = string.Empty; //生成数据 for (int i = 0; i < dataTable.Rows.Count; i++) { for (int j = 0; j < dataTable.Columns.Count; j++) { strValue = TWays.Utils.ToString(dataTable.Rows[i][j]); strValue = strValue.Replace("\r", ""); strValue = strValue.Replace("\n", ""); strValue = strValue.Replace("\t", ""); strValue = strValue.Replace("\"", ""); sb.Append(strValue); if (j < dataTable.Columns.Count - 1) sb.Append("\t"); } sb.Append(Environment.NewLine); } sw.Write(sb.ToString()); sw.Flush(); sw.Close(); } catch (Exception ex) { throw ex; } finally { sw = null; sb = null; dataTable = null; dataSet = null; dsWeek = null; GC.Collect(); } return true; } /// <summary> /// 通过StreamWriter写 /// </summary> /// <param name="dataSet"></param> /// <param name="dsWeek"></param> /// <param name="strOperDate"></param> /// <param name="fileName"></param> /// <returns></returns> public static bool WriteToExcel(DataSet dataSet, string fileName) { if (File.Exists(fileName)) { File.Delete(fileName); } System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNumber = dataTable.Rows.Count;//不包括字段名 if (rowNumber == 0) { return false; } StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("gb2312")); StringBuilder sb = new StringBuilder(); string strColName = string.Empty; try { int iColIndex = 0; //生成字段名称 foreach (DataColumn col in dataTable.Columns) { strColName = col.ColumnName; sb.Append(strColName); if (iColIndex < dataTable.Columns.Count - 1) { sb.Append("\t"); } iColIndex++; } sb.Append(Environment.NewLine); string strValue = string.Empty; //生成数据 for (int i = 0; i < dataTable.Rows.Count; i++) { for (int j = 0; j < dataTable.Columns.Count; j++) { strValue = TWays.Utils.ToString(dataTable.Rows[i][j]); strValue = strValue.Replace("\r", ""); strValue = strValue.Replace("\n", ""); strValue = strValue.Replace("\t", ""); strValue = strValue.Replace("\"", ""); sb.Append(strValue); if (j < dataTable.Columns.Count - 1) sb.Append("\t"); } sb.Append(Environment.NewLine); } sw.Write(sb.ToString()); sw.Flush(); sw.Close(); } catch (Exception ex) { throw ex; } finally { sw = null; sb = null; dataTable = null; dataSet = null; GC.Collect(); } return true; } public static System.Data.DataTable GetCsvData(string pCsvpath, string pCsvname) { try { DataSet dsCsvData = new DataSet(); OleDbConnection OleCon = new OleDbConnection(); OleDbCommand OleCmd = new OleDbCommand(); OleDbDataAdapter OleDa = new OleDbDataAdapter(); OleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pCsvpath + ";Extended Properties='Text;FMT=Delimited(,);HDR=YES;IMEX=1';"; OleCon.Open(); System.Data.DataTable dts1 = OleCon.GetSchema("Tables"); System.Data.DataTable dts2 = OleCon.GetSchema("Columns"); OleCmd.Connection = OleCon; OleCmd.CommandText = "select * from [" + pCsvname + "] where 1=1"; OleDa.SelectCommand = OleCmd; OleDa.Fill(dsCsvData, "Table"); OleCon.Close(); return dsCsvData.Tables[0]; } catch (Exception ex) { return null; } } }

/// <summary> /// HTTP请求工具类 /// </summary> public class HttpRequestUtil { #region 请求Url #region 请求Url,不发送数据POST /// <summary> /// 请求Url,不发送数据 /// </summary> public static string RequestUrl(string url) { return RequestUrl(url, "POST"); } public static string RequestUrl(string url, string method) { // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Timeout = 600000; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = method; request.ContentType = "text/html"; request.Headers.Add("charset", "utf-8"); //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); //返回结果网页(html)代码 string content = sr.ReadToEnd(); return content; } #endregion #region 请求Url,不发送数据GET public static string GetAppPage(string url, int httpTimeout, Encoding postEncoding) { string rStr = ""; System.Net.WebRequest req = null; System.Net.WebResponse resp = null; System.IO.Stream os = null; System.IO.StreamReader sr = null; try { //创建连接 req = System.Net.WebRequest.Create(url); req.ContentType = "application/x-www-form-urlencoded"; req.Method = "GET"; //时间 if (httpTimeout > 0) { req.Timeout = httpTimeout; } //读取返回结果 resp = req.GetResponse(); sr = new System.IO.StreamReader(resp.GetResponseStream(), postEncoding); rStr = sr.ReadToEnd(); rStr = rStr.Trim(); //除去空格 } catch { } finally { try { //关闭资源 if (os != null) { os.Dispose(); os.Close(); } if (sr != null) { sr.Dispose(); sr.Close(); } if (resp != null) { resp.Close(); } if (req != null) { req.Abort(); req = null; } } catch { } } return rStr; } #endregion #region 请求Url,发送数据 /// <summary> /// 请求Url,发送数据 /// </summary> public static string PostUrl(string url, string postData) { byte[] data = Encoding.UTF8.GetBytes(postData); // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.Timeout = 600000; request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; Stream outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回结果网页(html)代码 string content = sr.ReadToEnd(); return content; } #endregion #region 请求Url,上传文件 public static string HttpPosturl(string filePath, string url) { string returnStr = string.Empty; using (WebClient client = new WebClient()) { byte[] data = client.UploadFile(url, filePath); returnStr = Encoding.Default.GetString(data); } return returnStr; } #endregion #endregion #region Http下载文件 /// <summary> /// Http下载文件 /// </summary> public static string HttpDownloadFile(string url, string path) { // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Timeout = 600000; //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 Stream stream = new FileStream(path, FileMode.Create); byte[] bArr = new byte[1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Close(); responseStream.Close(); return path; } #endregion #region Http上传文件 /// <summary> /// Http上传文件 /// </summary> public static string HttpUploadFile(string url, string path) { // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Timeout = 600000; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary; byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); int pos = path.LastIndexOf("\\"); string fileName = path.Substring(pos + 1); //请求头部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName)); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); byte[] bArr = new byte[fs.Length]; fs.Read(bArr, 0, bArr.Length); fs.Close(); Stream postStream = request.GetRequestStream(); postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length); postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); postStream.Write(bArr, 0, bArr.Length); postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); postStream.Close(); //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回结果网页(html)代码 string content = sr.ReadToEnd(); return content; } #endregion }

using System; using System.Collections.Generic; using System.Data; using System.Web; using TWays.Core.DBAccess; using System.IO; /// <summary> /// 钉钉钉盘文件上传 /// </summary> public class TransDDExcel { public TransDDExcel() { _Result = ""; } private string _Result; // 结果消息 public string Result { get { return _Result; } set { _Result = value; } } public bool Process() { bool boolReturn = false; try { //存在数据库中的同步日志,推送成功的不在推送 DataSet dsSucess = DataAdapter.Query(string.Format(SqlText.selectGmTransTaskLogSucess, "1003")); if (dsSucess != null && dsSucess.Tables[0].Rows.Count > 0) { Nany.Web.Trans.BusiUtils.SaveLog(Constant.BsLogDirectory, "同步推送文件成功,无需再次同步。"); boolReturn = true; } else { #region string sysDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"); //获取企业号AccessToken和微应用AGEN_ID DDManager ddM = new DDManager(); string strToken = ddM.GetQyAccessToken(Constant.CST_DD_TYPE_FILE_PUSH); string strAgenId = ddM.GetDDAgenId(Constant.CST_DD_TYPE_FILE_PUSH); //获取根路径 string path = Nany.Web.Trans.BusiUtils.GetRootPath(); //组合两个路径字符串 path = Path.Combine(path, "TransExcel"); string strResult = string.Empty; string countPath = string.Empty; string customerOrderPath = string.Empty; List<string> _Path = new List<string>(); List<string> _title = new List<string>(); //查询数据库中可接收文件的钉钉用户 DataSet dsAccount = DataAdapter.Query(string.Format(SqlText.selectDDAccount.ToUpper(), strAgenId)); if (dsAccount.Tables[0].Rows.Count <= 0) { Result = "没有需要推送文件的账户"; return false; } //收银客单分析 DataSet dsPosCashInfo = DataAdapter.Query(string.Format(SqlText.selectDDPosCashAccount.ToUpper(), sysDate)); countPath = path + "\\" + DateTime.Now.AddDays(-1).ToString("yyyyMMdd") + "收银客单分析.xlsx"; _Path.Add(countPath); ExportExcel.DataSetToExcel(dsPosCashInfo, countPath); //组织客单分析 DataSet dsCustomerOrder = DataAdapter.Query(string.Format(SqlText.selectDDSelectOrgCustomerOrderAnalyze.ToUpper(), sysDate)); customerOrderPath = path + "\\" + DateTime.Now.AddDays(-1).ToString("yyyyMMdd") + "组织客单分析.xlsx"; _Path.Add(customerOrderPath); ExportExcel.DataSetToExcel(dsCustomerOrder, customerOrderPath); //发送两个文件 _title.Add(DateTime.Now.AddDays(-1).ToString("yyyyMMdd") + "收银客单分析.xlsx"); _title.Add(DateTime.Now.AddDays(-1).ToString("yyyyMMdd") + "组织客单分析.xlsx"); int error = 0; int success = 0; for (int i = 0; i < dsAccount.Tables[0].Rows.Count; i++) { DataRow dr = dsAccount.Tables[0].Rows[i]; string userId = ddM.GetQyUserId(strToken, dr["DD_CODE"].ToString()); if (string.IsNullOrEmpty(userId)) { error++; Nany.Web.Trans.BusiUtils.SaveLog(Constant.BsLogDirectory, "钉钉账号【" + dr["DD_CODE"].ToString() + "】不存在"); //Result = "钉钉账号【" + dr["DD_CODE"].ToString() + "】不存在"; continue; } for (int t = 0; t < _Path.Count; t++) { //判断当前路径所指向的是否为文件 if (File.Exists(_Path[t])) { //定义一个FileInfo对象,使之与filePath所指向的文件向关联, //以获取其大小 FileInfo fileInfo = new FileInfo(_Path[t]); decimal size = fileInfo.Length; string strMediaId = ddM.GetQyMediaId(Constant.CST_DD_TYPE_FILE_PUSH, size, _Path[t]); //Nany.Web.Trans.BusiUtils.SaveLog(Constant.BsLogDirectory, _Path[t]); strResult = HttpRequestUtil.RequestUrl(string.Format("https://oapi.dingtalk.com/cspace/add_to_single_chat?access_token={0}&agent_id={1}&userid={2}&media_id={3}&file_name={4}", ddM.GetQyAccessToken(Constant.CST_DD_TYPE_FILE_PUSH), strAgenId, dr["DD_CODE"].ToString(), HttpUtility.UrlEncode(strMediaId), HttpUtility.UrlEncode(_title[t]))); if (strResult.Contains("\"errmsg\":\"ok\"")) { boolReturn = true; success++; //Result = "已向" + (success/2).ToString() + "位用户成功推送文件,失败" + error.ToString() + "位"; } else { //Result = strResult; Nany.Web.Trans.BusiUtils.SaveLog(Constant.BsLogDirectory, strResult); boolReturn = false; } } } } Result = "已向" + (success / 2).ToString() + "位用户成功推送文件,失败" + error.ToString() + "位"; #endregion } } catch (Exception ex) { Result = ex.Message; } return boolReturn; } public void Dispose() { GC.SuppressFinalize(this); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix