C# 使用Azure函数自动将Excel保存到CSV

C# 使用Azure函数自动将Excel保存到CSV,c#,azure,azure-functions,azure-data-factory,azure-logic-apps,C#,Azure,Azure Functions,Azure Data Factory,Azure Logic Apps,尝试使用Azure函数自动将Excel文件以CSV形式保存到blob,以便我可以在Logic Apps或Azure Data Factory中使用。我希望使用ExcelDataReader C#library,我可以下载NuGet软件包到我的函数中,但之后我就被卡住了 当前,我似乎被卡住了,因为File.Open命令在本地路径上查找文件,我得到以下错误: 使用(var stream=File.Open(filePath,FileMode.Open,FileAccess.Read)) 文件名、目录

尝试使用Azure函数自动将Excel文件以CSV形式保存到blob,以便我可以在Logic Apps或Azure Data Factory中使用。我希望使用ExcelDataReader C#library,我可以下载NuGet软件包到我的函数中,但之后我就被卡住了

当前,我似乎被卡住了,因为File.Open命令在本地路径上查找文件,我得到以下错误:

使用(var stream=File.Open(filePath,FileMode.Open,FileAccess.Read))

文件名、目录名或卷标语法不正确:“D:\Program Files(x86)\SiteExtensions\Functions\2.0.12507\64位…”


关于通过Azure函数保存XLSX,大家有什么建议吗?

您不必手动打开流,Azure函数绑定可以为您进行读写操作

例:


如果使用
Environment.CurrentDirectory
获取正在执行的目录,它将响应您显示的目录。这个目录在azure kudu中,不允许创建文件,所以你的excel文件不在那里。您可以使用
context.FunctionDirectory
获取当前函数目录(例如,在Azure上运行时)

例:

publicstaticvoidrun([TimerTrigger(“0*/1****”)]TimerInfo myTimer、ILogger日志、ExecutionContext)
{
var excelFilePath=context.FunctionDirectory+@“\Book.xlsx”;
var destinationCsvFilePath=context.FunctionDirectory+@“\test.csv”;
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
var stream=新文件流(excelFilePath、FileMode.Open、FileAccess.Read、FileShare.ReadWrite);
IExcelDataReader=null;
reader=ExcelReaderFactory.CreateOpenXmlReader(流);
var ds=reader.AsDataSet(新的ExcelDataSetConfiguration()
{
ConfigureDataTable=(tableReader)=>new ExcelDataTableConfiguration()
{
UseHeaderRow=false
}
});
var csvContent=string.Empty;
int row_no=0;
while(行号
只需在此处更新您的excel:


谢谢,我花了一点时间设置绑定,但这似乎就是我的问题所在。
[FunctionName("ConvertExcelToCSV")]
    public static async Task RunAsync(
        [BlobTrigger("excel-files/{blobName}")] Stream excelFileInput,
        [Blob("csv-files/{blobName}", FileAccess.Write)] Stream csvFileOutput,
        CancellationToken token,
        ILogger log)
    {
        log.LogInformation($"Do your processing on the excelFileInput file here.");
        //Do your processing on another steam. Maybe, MemoryStream
        await memoryStream.CopyToAsync(csvFileOutput, 4096, token);
    }
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
        {
            var excelFilePath = context.FunctionDirectory + @"\Book.xlsx";
            var destinationCsvFilePath = context.FunctionDirectory + @"\test.csv";

            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            IExcelDataReader reader = null;

            reader = ExcelReaderFactory.CreateOpenXmlReader(stream);

            var ds = reader.AsDataSet(new ExcelDataSetConfiguration()
            {
                ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = false
                }
            });

            var csvContent = string.Empty;
            int row_no = 0;
            while (row_no < ds.Tables[0].Rows.Count)
            {
                var arr = new List<string>();
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    arr.Add(ds.Tables[0].Rows[row_no][i].ToString());
                }
                row_no++;
                csvContent += string.Join(",", arr) + "\n";
            }
            StreamWriter csv = new StreamWriter(destinationCsvFilePath, false);
            csv.Write(csvContent);
            csv.Close();

            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }