Jest dzieckiem Aleksandra i Zofii. W 1978 roku zdobył wykształcenie wyższe na kierunku Budownictwo Lądowe na Politechnice Poznańskiej, specjalizując się w budownictwie miejskim i przemysłowym. W 2003 roku dokształcił się na studiach podyplomowych z zakresu wyceny nieruchomości na Politechnice Szczecińskiej.
Od końca lat 70. angażował się w prace budowlane w regionie Wielkopolski. W 1990 roku wszedł w struktury samorządowe Gniezna, początkowo jako radny miejski, później również jako wiceprezydent tego miasta. W 2002 roku wybrano go do sejmiku wielkopolskiego, gdzie objął rolę przewodniczącego. W latach 2004–2005 reprezentował Polskę w Komitecie Regionów UE.
W dekadzie 80. był aktywnym członkiem NSZZ „Solidarność”. Później, w latach 1992–1993, związany był z Partią Chrześcijańskich Demokratów, a od 1997 do 2001 roku z Ruchem Społecznym AWS. W 2002 roku dołączył do Platformy Obywatelskiej. Jest również członkiem Gnieźnieńskiego Klubu Katolików od 1990 roku oraz Stowarzyszenia Rodzin Katolickich od 1997 roku.
W 1997 roku został wybrany posłem z okręgu poznańskiego z listy AWS. W parlamencie uczestniczył w pracach Komisji Finansów Publicznych i Komisji Polityki Przestrzennej, Budowlanej i Mieszkaniowej. W 2001 roku nie zdobył reelekcji. W latach 2001–2005 był dyrektorem administracyjnym Kolegium Europejskiego w Gnieźnie, działającym przy Uniwersytecie im. Adama Mickiewicza. W 2005 roku powrócił do Sejmu, zdobywając 6 546 głosów w okręgu konińskim z listy Platformy Obywatelskiej.
W 2007 roku uzyskał kolejną kadencję w Sejmie, otrzymując 17 394 głosy. W 2009 roku objął funkcję przewodniczącego Komisji Finansów Publicznych. W kolejnych wyborach parlamentarnych w 2011 i 2015 roku również zdobywał mandaty poselskie, otrzymując odpowiednio 12 627 i 17 925 głosów. W ostatniej z tych kadencji był zastępcą przewodniczącego Komisji Cyfryzacji, Innowacyjności i Nowoczesnych Technologii oraz członkiem Komisji Finansów Publicznych.
W 2019 roku został senatorem dziesiątej kadencji. Startował z listy Koalicji Obywatelskiej w okręgu nr 92 i zdobył 76 897 głosów.