我希望能够提供一个选择来自电脑任何位置的文件的选项。目前,我是这样明确给出路径的:
FileInfo existingFile = new FileInfo(@"C:\Users\User_name\Downloads\bank_statement.xlsx");
使用EPPlus操作Excel文件。如何直接从所需文件夹获取文件? 控制台应用程序.NET Core 3.1 C#。
我希望能够提供一个选择来自电脑任何位置的文件的选项。目前,我是这样明确给出路径的:
FileInfo existingFile = new FileInfo(@"C:\Users\User_name\Downloads\bank_statement.xlsx");
using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace DemoApp
{
// From https://www.pinvoke.net/default.aspx/Structures/OPENFILENAME.html
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct OpenFileName
{
public int lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
public string lpstrFilter;
public string lpstrCustomFilter;
public int nMaxCustFilter;
public int nFilterIndex;
public string lpstrFile;
public int nMaxFile;
public string lpstrFileTitle;
public int nMaxFileTitle;
public string lpstrInitialDir;
public string lpstrTitle;
public int Flags;
public short nFileOffset;
public short nFileExtension;
public string lpstrDefExt;
public IntPtr lCustData;
public IntPtr lpfnHook;
public string lpTemplateName;
public IntPtr pvReserved;
public int dwReserved;
public int flagsEx;
}
public class Program
{
// From https://www.pinvoke.net/default.aspx/comdlg32/GetOpenFileName.html
[DllImport("comdlg32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool GetOpenFileName(ref OpenFileName ofn);
private static string ShowDialog()
{
var ofn = new OpenFileName();
ofn.lStructSize = Marshal.SizeOf(ofn);
// Define Filter for your extensions (Excel, ...)
ofn.lpstrFilter = "Excel Files (*.xlsx)\0*.xlsx\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = new string(new char[256]);
ofn.nMaxFile = ofn.lpstrFile.Length;
ofn.lpstrFileTitle = new string(new char[64]);
ofn.nMaxFileTitle = ofn.lpstrFileTitle.Length;
ofn.lpstrTitle = "Open File Dialog...";
if (GetOpenFileName(ref ofn))
return ofn.lpstrFile;
return string.Empty;
}
public static void Main(string[] args)
{
var filename = ShowDialog();
Console.WriteLine(filename);
}
}
}
<UseWindowsForms>true</UseWindowsForms>
:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
那么:
using System;
using System.Windows.Forms;
namespace ConsoleApp
{
class Program
{
[STAThread]
static void Main(string[] args)
{
OpenFileDialog dialog = new OpenFileDialog();
if (DialogResult.OK == dialog.ShowDialog())
{
string path = dialog.FileName;
}
Console.WriteLine("Hello World!");
}
}
}