1. 程式人生 > >C#實現EXCEL資料的匯入匯出

C#實現EXCEL資料的匯入匯出

使用者經常會有這種需求,可以將excel中的資料自動匯入到資料庫,而不用費時費力地手動新增,或者將某些資料匯出存放到excel表格中。

一、excel匯入

實現思路:先將excel檔案上傳到伺服器(檔案上傳請移步前一篇文章外掛webuploader實現檔案上傳),然後讀取表格中的內容,將內容新增到相應資料表中,最後再將上傳的excel檔案刪除。

前臺程式碼:

<div class="div-content">
    <div class="list">
        <dl>
            <dt>Excel檔案:</dt
>
<dd> <asp:TextBox ID="txtImgUrl" runat="server" CssClass="input normal upload-path" /> <div class="upload-box upload-img"> </div> </dd> </dl> </div> <div class="toolbar"
>
<asp:Button ID="btnOK" Style="margin-left: 20px" runat="server" Text="匯入" class="btn" OnClick="btnOK_Click" /> </div> </div>

後臺程式碼如下:

//匯入事件
protected void btnOK_Click(object sender, EventArgs e)
{
    DataTable dt = null;
    if (this.txtImgUrl.Text.Trim() != "")
    {
        string filePath = MapPath(this.txtImgUrl
.Text.Trim());//獲取虛擬路徑 FileStream file = File.OpenRead(filePath);//讀取檔案 dt = DotNet.FrameWork.Common.Office.NPOIExcelReader.RenderFromExcel(file); if (dt.Rows.Count > 0) { if (dt.Rows.Count > 200) { JscriptMsg("匯入記錄數超過最大限制200條!請分批匯入!", string.Empty); return; } HR_Employee mdEmployee = new HR_Employee(); HR_UserProfile mdUserProfile; HR_EmployeeManager bllEmployee = new HR_EmployeeManager(); departmentManager bllDept = new departmentManager(); HR_PostManager bllPost = new HR_PostManager(); HR_DutyManager bllDuty = new HR_DutyManager(); HR_UserProfileManager bllUserProfile = new HR_UserProfileManager(); HR_EnterpriseManager bllEnterprise = new HR_EnterpriseManager(); int sucCount = 0, errorCount = 0; try { foreach (DataRow dr in dt.Rows) { mdUserProfile = new HR_UserProfile(); if (dr["身份證號"].ToString() == "" || bllEmployee.Exists(dr["身份證號"].ToString())) { errorCount++; continue; } mdEmployee = new HR_Employee(); mdEmployee.UId = bllUserProfile.GetUIdByUPshenfenID(dr["身份證號"].ToString()); mdEmployee.dept_id = dr["部門"].ToString() == "" ? 0 : bllDept.GetDeptIdByDeptName(dr["部門"].ToString()); mdEmployee.PID = dr["崗位"].ToString() == "" ? 0 : bllPost.GetPIdByPostName(dr["崗位"].ToString()); mdEmployee.E_Id = dr["保險所在公司"].ToString() == "" ? 0 : bllEnterprise.EidByEname(dr["保險所在公司"].ToString()); mdEmployee.duty = dr["職位"].ToString() == "" ? 0 : bllDuty.GetIdByDutyName(dr["職位"].ToString()); mdEmployee.emp_name = dr["姓名"].ToString(); mdEmployee.emp_sex = dr["性別"].ToString(); mdEmployee.emp_CardId = dr["身份證號"].ToString(); mdEmployee.culture_degree = dr["文化程度"].ToString(); mdEmployee.political_status = dr["政治面貌"].ToString(); mdEmployee.emp_mobile = dr["聯絡方式"].ToString(); mdEmployee.related_man = dr["緊急人"].ToString(); mdEmployee.urgent_telephone = dr["緊急聯絡方式"].ToString(); mdEmployee.contract_beg_date = DataTimeOperate(dr["合同起始日期"].ToString()); //dr["合同起始日期"].ToString() == "" ? Convert.ToDateTime("1900-1-1") : Convert.ToDateTime(dr["合同起始日期"].ToString().Replace("/", "-")); mdEmployee.contract_end_date = DataTimeOperate(dr["合同終止日期"].ToString()); //dr["合同終止日期"].ToString() == "" ? Convert.ToDateTime("1900-1-1") : Convert.ToDateTime(dr["合同終止日期"].ToString().Replace("/", "-")); mdEmployee.contract_count = dr["合同期限"].ToString() == "" ? 0 : Convert.ToInt32(dr["合同期限"]); mdEmployee.contract_period = dr["合同續訂次數"].ToString() == "" ? 0 : Convert.ToInt32(dr["合同續訂次數"]); mdEmployee.note_info = dr["備註"].ToString(); mdEmployee.Earea = ""; mdEmployee.emp_email = ""; mdEmployee.emp_qq = ""; mdEmployee.emp_weixin = ""; mdEmployee.technical = ""; mdEmployee.emp_state = int.Parse(this.rblState.SelectedValue); mdEmployee.myorder = 999; int emp_id = bllEmployee.Add(mdEmployee);//新增到職工表 if (emp_id > 0) { sucCount++; } else { errorCount++; } } } catch (Exception ex) { errorCount++; } Response.Write("<script>top.dialog.get(window).close();</script>"); JscriptMsg("匯入成功" + sucCount + "條,失敗" + errorCount + "條", "EmployeeList.aspx"); } else { JscriptMsg("請確保文件中有資料記錄行!", string.Empty); } File.Delete(filePath); } else { JscriptMsg("請先選擇要匯入的Excel文件!", string.Empty); } } //日期格式處理 protected DateTime DataTimeOperate(string str_date) { if (str_date != "") { int index = str_date.LastIndexOf("/"); string newdate = str_date.Substring(index + 1) + "/" + str_date.Substring(0, index); return Convert.ToDateTime(newdate); } else { return Convert.ToDateTime("1900-1-1"); } }

二、excel匯出

使用者自定義選擇要匯出的欄位。
實現程式碼(前臺使用CheckBoxList動態繫結所有欄位)

<div class="div-content">
    <div class="list">
        <asp:CheckBoxList ID="cblist" runat="server" RepeatColumns="7" RepeatDirection="Horizontal">
        </asp:CheckBoxList>
    </div>
    <div class="toolbar">
        <asp:Button ID="btnOK" Style="margin-left: 20px" runat="server" Text="匯出" class="btn" OnClick="btnOK_Click" />
    </div>
</div>

後臺程式碼:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindField();
    }
}
//繫結欄位
protected void BindField()
{
    this.cblist.Items.Clear();
    this.cblist.Items.Add(new ListItem("部門", "b.dep_name as 部門"));
    this.cblist.Items.Add(new ListItem("崗位", "c.PostName as 崗位"));
    this.cblist.Items.Add(new ListItem("姓名", "a.emp_name as 姓名"));
    this.cblist.Items.Add(new ListItem("出生日期", "convert(varchar(50),d.UPBirthday,23) as 出生日期"));
    this.cblist.Items.Add(new ListItem("年齡", "datediff(year,d.UPBirthday,getdate()) as 年齡"));
    this.cblist.Items.Add(new ListItem("性別", "a.emp_sex as 性別"));
    this.cblist.Items.Add(new ListItem("身份證號", "a.emp_CardId as 身份證號"));
    this.cblist.Items.Add(new ListItem("婚姻狀況", "(case UPMarriage when 1 then '已婚' when 0 then '未婚' else null end)as 婚姻狀況"));
    this.cblist.Items.Add(new ListItem("入職時間", "convert(varchar(50),d.UPEntry,23) as 入職時間"));
    this.cblist.Items.Add(new ListItem("轉正時間", "convert(varchar(50),d.UPZhuanzhengDate,23) as 轉正時間"));
    this.cblist.Items.Add(new ListItem("工齡(月)", "datediff(month,d.UPEntry,getdate()) as '工齡(月)'"));
    this.cblist.Items.Add(new ListItem("薪資", "d.USalary as 薪資"));
    this.cblist.Items.Add(new ListItem("合同起始日期", "convert(varchar(50),a.contract_beg_date,23) as 合同起始日期"));
    this.cblist.Items.Add(new ListItem("合同終止日期", "convert(varchar(50),a.contract_end_date,23) as 合同終止日期"));
    this.cblist.Items.Add(new ListItem("工作經歷", ""));
    for (int i = 0; i < this.cblist.Items.Count; i++)
    {
        //if (i < 12)
        cblist.Items[i].Selected = true;
    }
}
//獲取表格
protected DataTable BindTable(string chkSelect)
{
    return bllEmplyee.GetListByMultiCond(chkSelect);
}
//開始匯出
protected void btnOK_Click(object sender, EventArgs e)
{
    try
    {
        string chkSelect = "";
        for (int i = 0; i < cblist.Items.Count; i++)
        {
            if (cblist.Items[i].Selected)
            {
                chkSelect += cblist.Items[i].Value + ",";
            }
        }
        if (chkSelect != "")
        {
            chkSelect = chkSelect.Substring(0, chkSelect.Length - 1);
        }
        DataTable dt = new DataTable();
        if (this.cblist.Items[34].Selected && this.cblist.Items[34].Text == "工作經歷")
        {
            dt = BindTable(chkSelect.Substring(0, chkSelect.Length - 1));
            dt.Columns.Add("工作起止日期1", typeof(System.String));
            dt.Columns.Add("工作情況1", typeof(System.String));
            dt.Columns.Add("離職原因1", typeof(System.String));
            dt.Columns.Add("工作起止日期2", typeof(System.String));
            dt.Columns.Add("工作情況2", typeof(System.String));
            dt.Columns.Add("離職原因2", typeof(System.String));
            DataTable dtwork;
            HR_UserWorkResumeManager bllUserWork = new HR_UserWorkResumeManager();
            foreach (DataRow dr in dt.Rows)
            {
                dtwork = null;
                dtwork = bllUserWork.GetListByEmpId(Convert.ToInt32(dr["emp_id"]));
                if (dtwork.Rows.Count > 0)
                {
                    dr["工作起止日期1"] = dtwork.Rows[0]["UWPeriod"];
                    dr["工作情況1"] = dtwork.Rows[0]["UWCompany"];
                    dr["離職原因1"] = dtwork.Rows[0]["UWLeaveReason"];
                    if (dtwork.Rows.Count > 1)
                    {
                        dr["工作起止日期2"] = dtwork.Rows[1]["UWPeriod"];
                        dr["工作情況2"] = dtwork.Rows[1]["UWCompany"];
                        dr["離職原因2"] = dtwork.Rows[1]["UWLeaveReason"];
                    }
                }
            }
        }
        else
            dt = BindTable(chkSelect);
        dt.Columns.Remove("new_index");
        dt.Columns.Remove("dutyorder");
        dt.Columns.Remove("myorder");
        dt.Columns.Remove("UPEntry");
        dt.Columns.Remove("emp_id");
        DotNet.FrameWork.Common.Office.NPOIExcelReader.RenderToExcel(dt, Context, DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".xls");
        Response.Write("<script>top.dialog.get(window).close();</script>");
    }
    catch { }
}

其中程式碼中所用方法DotNet.FrameWork.Common.Office.NPOIExcelReader.RenderFromExcel所在類請前往下載頁面下載——NPOI呼叫介面