请教一下,目前接到上级文件,要求我们将生产信息(产品名称、规格、数量等),采用json报文的形式上传平台,并提供了接口调用,因为对此不熟悉,我们摸索着写了一个接口程序,请各位先看软件代码是否符合要求,另外运行时,程序总提示,需要用epplus8,或更高的版本等,但我用vS2022就支持epplus--8.0beta,具体要求和代码如下,请各位指导一下,多谢;




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Ranges;
using Newtonsoft.Json;
namespace Interfacetest
{
public partial class Form1 : Form
{
private static readonly string ak = "your_ak";
private static readonly string sk = "your_sk";
private static readonly string excelFilePath = @"E:\上传文件夹\国产药信息上传-模板那说明.xlsx";
private static readonly HttpClient _httpClient = new HttpClient();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{ }
public static async Task Main(string[] args)
{
//// 初始化EPPlus
//ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
// 从Excel文件中读取药品信息
var productList = ReadProductInfoFromExcel(excelFilePath);
//批量上传药品信息
await UploadProductsAsync(productList);
}
private static List<Dictionary<string, object>> ReadProductInfoFromExcel(string filePath)
{
var productList = new List<Dictionary<string, object>>();
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
var worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
for (int row = 2; row <= rowCount; row++)
{
if (!int.TryParse(worksheet.Cells[row, 3].Text, out int quantity))
{
MessageBox.Show($"第 {row} 行数量格式错误");
continue;
}
var product = new Dictionary<string, object>
{
{ "productName", worksheet.Cells[row, 1].Text },
{ "specification", worksheet.Cells[row, 2].Text },
{ "quantity", quantity },
{ "traceCode", worksheet.Cells[row, 4].Text }
};
productList.Add(product);
}
}
return productList;
}
private static async Task UploadProductsAsync(List<Dictionary<string, object>> products)
{
long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var param = new { data = products };
string sign = GenerateSignature(ak, timestamp.ToString(), sk, param);
var payload = new
{
ak,
timestamp,
sign,
param
};
var content = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("https://api.medicalinsurance.gov.cn/upload", content);
if (!response.IsSuccessStatusCode)
{
string error = await response.Content.ReadAsStringAsync();
throw new Exception($"API错误:{error}");
}
}
private static string GenerateSignature(string ak, string timestamp, string sk, object param)
{
string paramJson = JsonConvert.SerializeObject(param);
string rawString = ak + timestamp + sk + paramJson;
using (SHA256 sha256 = SHA256.Create())
{
byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(rawString));
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
private static async Task SendRequestAsync(object payload)
{
using (var client = new HttpClient())
{
var content = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.medicalinsurance.gov.cn/upload", content);
if (response.IsSuccessStatusCode)
{
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine("上传成功: " + responseString);
}
else
{
Console.WriteLine("上传失败: " + response.StatusCode);
}
}
}
private async void button1_Click(object sender, EventArgs e)
{
try
{
var products = ReadProductInfoFromExcel(excelFilePath);
await UploadProductsAsync(products);
MessageBox.Show("上传成功!");
}
catch (Exception ex)
{
MessageBox.Show($"错误:{ex.Message}");
}
}
}
}